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

Artifact 7c52ea8b322992a91a241c0092a5bf97b141d353:


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 64 65 66 61 75 6c  rn 0;.    defaul
af60: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
af70: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
af80: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
af90: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
afa0: 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
afb0: 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
afc0: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
afd0: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
afe0: 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
aff0: 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
b000: 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
b010: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b020: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
b030: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
b040: 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
b050: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
b060: 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
b070: 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
b080: 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
b090: 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
b0a0: 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
b0b0: 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
b0c0: 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
b0d0: 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
b0e0: 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
b0f0: 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
b100: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
b110: 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
b120: 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
b130: 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
b140: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72 65  TE_AFF_NONE ) re
b150: 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
b160: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
b170: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
b180: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
b190: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
b1a0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
b1b0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
b1c0: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
b1d0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
b1e0: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
b1f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
b200: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
b210: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
b220: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
b230: 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
b240: 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
b250: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
b260: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
b270: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
b280: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
b290: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
b2a0: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
b2b0: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
b2c0: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
b2d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
b2e0: 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
b2f0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
b300: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
b310: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b320: 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
b330: 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
b340: 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
b350: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
b360: 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
b370: 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
b380: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
b390: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
b3a0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
b3b0: 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
b3c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
b3d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
b3e0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
b3f0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
b400: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
b410: 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
b420: 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
b430: 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
b440: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
b450: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
b460: 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
b470: 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
b480: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
b490: 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
b4a0: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
b4b0: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
b4c0: 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
b4d0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
b4e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b4f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b500: 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65  e if we are able
b510: 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72 61   to the IN opera
b520: 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  tor optimization
b530: 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20 6f   on a.** query o
b540: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
b550: 20 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c         x IN (SEL
b560: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57  ECT ...).**.** W
b570: 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 2e  here the SELECT.
b580: 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73 20  .. clause is as 
b590: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
b5a0: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
b5b0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a  is.** routine..*
b5c0: 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74 20  *.** The Select 
b5d0: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 69 6e  object passed in
b5e0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
b5f0: 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64 20 61  n preprocessed a
b600: 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73 20  nd no.** errors 
b610: 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e  have been found.
b620: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
b630: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b640: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 43 61  .static int isCa
b650: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
b660: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
b670: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45  cList *pSrc;.  E
b680: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
b690: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
b6a0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
b6b0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
b6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68           /* righ
b6d0: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49  t-hand side of I
b6e0: 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  N is SELECT */. 
b6f0: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
b700: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
b710: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61          /* Not a
b720: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
b730: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
b740: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
b750: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
b760: 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  e) ){.    testca
b770: 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
b780: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
b790: 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
b7a0: 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
b7b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
b7c0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
b7d0: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
b7e0: 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
b7f0: 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74  egate );.    ret
b800: 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53  urn 0; /* No DIS
b810: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e  TINCT keyword an
b820: 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  d no aggregate f
b830: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a  unctions */.  }.
b840: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
b850: 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20  oupBy==0 );     
b860: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
b870: 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
b880: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  se */.  if( p->p
b890: 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
b8a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b8b0: 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63  * Has no LIMIT c
b8c0: 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lause */.  asser
b8d0: 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
b8e0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
b8f0: 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65    /* No LIMIT me
b900: 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f  ans no OFFSET */
b910: 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
b920: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
b930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
b940: 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
b950: 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   */.  pSrc = p->
b960: 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
b970: 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
b980: 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
b990: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
b9a0: 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65      /* Single te
b9b0: 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  rm in FROM claus
b9c0: 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  e */.  if( pSrc-
b9d0: 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20  >a[0].pSelect ) 
b9e0: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
b9f0: 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73   FROM is not a s
ba00: 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20  ubquery or view 
ba10: 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  */.  pTab = pSrc
ba20: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69  ->a[0].pTab;.  i
ba30: 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30  f( NEVER(pTab==0
ba40: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
ba50: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
ba60: 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20  elect==0 );     
ba70: 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
ba80: 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76  lause is not a v
ba90: 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  iew */.  if( IsV
baa0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
bab0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
bac0: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e  /* FROM clause n
bad0: 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
bae0: 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  le */.  pEList =
baf0: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
bb00: 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
bb10: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
bb20: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75       /* One colu
bb30: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
bb40: 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70 45   set */.  if( pE
bb50: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
bb60: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
bb70: 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52  ) return 0; /* R
bb80: 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d  esult is a colum
bb90: 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b  n */.  return 1;
bba0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
bbb0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
bbc0: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  Y */../*.** Code
bbd0: 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   an OP_Once inst
bbe0: 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f  ruction and allo
bbf0: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69  cate space for i
bc00: 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20  ts flag. Return 
bc10: 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  the .** address 
bc20: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
bc30: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  uction..*/.int s
bc40: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50  qlite3CodeOnce(P
bc50: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
bc60: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
bc70: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
bc80: 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75  );      /* Virtu
bc90: 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
bca0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75   coded */.  retu
bcb0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
bcc0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c  dOp1(v, OP_Once,
bcd0: 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b   pParse->nOnce++
bce0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
bcf0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
bd00: 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
bd10: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
bd20: 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  N (...) operator
bd30: 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61  ..** The pX para
bd40: 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70  meter is the exp
bd50: 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52  ression on the R
bd60: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
bd70: 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20  rator, which.** 
bd80: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
bd90: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
bda0: 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75  sions or a subqu
bdb0: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ery..**.** The j
bdc0: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
bdd0: 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ne is to find or
bde0: 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
bdf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e   object that can
be00: 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68  .** be used eith
be10: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
be20: 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65  embership in the
be30: 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69   RHS set or to i
be40: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a  terate through.*
be50: 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  * all members of
be60: 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b   the RHS set, sk
be70: 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
be80: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f  s..**.** A curso
be90: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  r is opened on t
bea0: 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
beb0: 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53   that is the RHS
bec0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
bed0: 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69  tor.** and pX->i
bee0: 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
bef0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
bf00: 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t cursor..**.** 
bf10: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
bf20: 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
bf30: 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68  ion indicates th
bf40: 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61  e b-tree type, a
bf50: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
bf60: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49     IN_INDEX_ROWI
bf70: 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72  D      - The cur
bf80: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
bf90: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
bfa0: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
bfb0: 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54  X_INDEX_ASC  - T
bfc0: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
bfd0: 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e  ened on an ascen
bfe0: 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
bff0: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
c000: 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f  DESC - The curso
c010: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
c020: 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
c030: 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
c040: 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54  X_EPH        - T
c050: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
c060: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
c070: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
c080: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c090: 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
c0a0: 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
c0b0: 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
c0c0: 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d  DEX_NOOP       -
c0d0: 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61   No cursor was a
c0e0: 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 69  llocated.  The i
c0f0: 6e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20  n operator must 
c100: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d                im
c120: 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73  plemented as a s
c130: 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
c140: 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  risons..**.** An
c150: 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65   existing b-tree
c160: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69   might be used i
c170: 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73  f the RHS expres
c180: 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d  sion pX is a sim
c190: 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ple.** subquery 
c1a0: 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  such as:.**.**  
c1b0: 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
c1c0: 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  n> FROM <table>.
c1d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
c1e0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
c1f0: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
c200: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
c210: 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
c220: 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
c230: 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
c240: 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
c250: 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
c260: 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
c270: 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
c280: 74 20 74 6f 20 74 68 65 20 65 70 68 65 72 6d 65  t to the epherme
c290: 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61  ral table instea
c2a0: 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74  d of an.** exist
c2b0: 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ing table..**.**
c2c0: 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72   The inFlags par
c2d0: 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74  ameter must cont
c2e0: 61 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ain exactly one 
c2f0: 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49  of the bits.** I
c300: 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
c310: 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c  IP or IN_INDEX_L
c320: 4f 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73  OOP.  If inFlags
c330: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f   contains.** IN_
c340: 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
c350: 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72  , then the gener
c360: 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20  ated table will 
c370: 62 65 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a  be used for a.**
c380: 20 66 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70   fast membership
c390: 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65   test.  When the
c3a0: 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62   IN_INDEX_LOOP b
c3b0: 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a  it is set, the.*
c3c0: 2a 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20  * IN index will 
c3d0: 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20  be used to loop 
c3e0: 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
c3f0: 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  of the RHS of th
c400: 65 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72  e.** IN operator
c410: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
c420: 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73  INDEX_LOOP is us
c430: 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
c440: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
c450: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
c460: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
c470: 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20  mbers) then the 
c480: 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20  b-tree must not 
c490: 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74  contain duplicat
c4a0: 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65  es..** An ephere
c4b0: 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62  mal table must b
c4c0: 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68  e used unless th
c4d0: 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75  e selected <colu
c4e0: 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65  mn> is guarantee
c4f0: 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75  d.** to be uniqu
c500: 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75  e - either becau
c510: 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45  se it is an INTE
c520: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
c530: 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55  or it.** has a U
c540: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
c550: 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78   or UNIQUE index
c560: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
c570: 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
c580: 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
c590: 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
c5a0: 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
c5b0: 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
c5c0: 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e  p tests) then an
c5d0: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
c5e0: 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
c5f0: 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
c600: 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  > is an INTEGER 
c610: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61  PRIMARY KEY or a
c620: 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20  n index can .** 
c630: 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63  be found with <c
c640: 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65  olumn> as its le
c650: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a  ft-most column..
c660: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f  **.** If the IN_
c670: 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e  INDEX_NOOP_OK an
c680: 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  d IN_INDEX_MEMBE
c690: 52 53 48 49 50 20 61 72 65 20 62 6f 74 68 20 73  RSHIP are both s
c6a0: 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65  et and.** if the
c6b0: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
c6c0: 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
c6d0: 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t (not a subquer
c6e0: 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  y) then this.** 
c6f0: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65  routine might de
c700: 63 69 64 65 20 74 68 61 74 20 63 72 65 61 74 69  cide that creati
c710: 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
c720: 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65  b-tree for membe
c730: 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67  rship.** testing
c740: 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76   is too expensiv
c750: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f  e and return IN_
c760: 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 4e 20  INDEX_NOOP.  IN 
c770: 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a  that case, the.*
c780: 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
c790: 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65  e should impleme
c7a0: 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  nt the IN operat
c7b0: 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71 75 65  or using a seque
c7c0: 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20  nce.** of Eq or 
c7d0: 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  Ne comparison op
c7e0: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
c7f0: 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  When the b-tree 
c800: 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  is being used fo
c810: 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
c820: 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ts, the calling 
c830: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68  function.** migh
c840: 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77  t need to know w
c850: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
c860: 65 20 52 48 53 20 73 69 64 65 20 6f 66 20 74 68  e RHS side of th
c870: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
c880: 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c   contains a NULL
c890: 2e 20 20 49 66 20 70 72 4e 6f 74 46 6f 75 6e 64  .  If prNotFound
c8a0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64   is not NULL and
c8b0: 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73   .** if there is
c8c0: 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74   any chance that
c8d0: 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74   the (...) might
c8e0: 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20   contain a NULL 
c8f0: 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74  value at.** runt
c900: 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69  ime, then a regi
c910: 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
c920: 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74  d and the regist
c930: 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65  er number writte
c940: 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f  n.** to *prNotFo
c950: 75 6e 64 2e 20 49 66 20 74 68 65 72 65 20 69 73  und. If there is
c960: 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
c970: 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69  the (...) contai
c980: 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  ns a.** NULL val
c990: 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46  ue, then *prNotF
c9a0: 6f 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63  ound is left unc
c9b0: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
c9c0: 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
c9d0: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73  llocated and its
c9e0: 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64   location stored
c9f0: 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c   in *prNotFound,
ca00: 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69   then.** its ini
ca10: 74 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55  tial value is NU
ca20: 4c 4c 2e 20 20 49 66 20 74 68 65 20 28 2e 2e 2e  LL.  If the (...
ca30: 29 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69  ) does not remai
ca40: 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f  n constant.** fo
ca50: 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f  r the duration o
ca60: 66 20 74 68 65 20 71 75 65 72 79 20 28 69 2e 65  f the query (i.e
ca70: 2e 20 74 68 65 20 53 45 4c 45 43 54 20 77 69 74  . the SELECT wit
ca80: 68 69 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a  hin the (...).**
ca90: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
caa0: 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
cab0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
cac0: 20 61 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73   allocated regis
cad0: 74 65 72 20 69 73 0a 2a 2a 20 72 65 73 65 74 20  ter is.** reset 
cae0: 74 6f 20 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d  to NULL each tim
caf0: 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
cb00: 73 20 72 65 72 75 6e 2e 20 54 68 69 73 20 61 6c  s rerun. This al
cb10: 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  lows the.** call
cb20: 65 72 20 74 6f 20 75 73 65 20 76 64 62 65 20 63  er to use vdbe c
cb30: 6f 64 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74  ode equivalent t
cb40: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
cb50: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67  .**.**   if( reg
cb60: 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a  ister==NULL ){.*
cb70: 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d  *     has_null =
cb80: 20 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73   <test if data s
cb90: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
cba0: 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72  s null>.**     r
cbb0: 65 67 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20  egister = 1.**  
cbc0: 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65   }.**.** in orde
cbd0: 72 20 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69  r to avoid runni
cbe0: 6e 67 20 74 68 65 20 3c 74 65 73 74 20 69 66 20  ng the <test if 
cbf0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
cc00: 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a  ontains null>.**
cc10: 20 74 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e   test more often
cc20: 20 74 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61   than is necessa
cc30: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
cc40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
cc50: 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  ERY.int sqlite3F
cc60: 69 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65  indInIndex(Parse
cc70: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
cc80: 70 58 2c 20 75 33 32 20 69 6e 46 6c 61 67 73 2c  pX, u32 inFlags,
cc90: 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64   int *prNotFound
cca0: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20  ){.  Select *p; 
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
ccd0: 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68  LECT to the righ
cce0: 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  t of IN operator
ccf0: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
cd00: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cd20: 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65  ype of RHS table
cd30: 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a  . IN_INDEX_* */.
cd40: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
cd50: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
cd60: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
cd70: 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62  r of the RHS tab
cd80: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
cd90: 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20  BeUnique;       
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cdb0: 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73   True if RHS mus
cdc0: 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  t be unique */. 
cdd0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
cde0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
cdf0: 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  );     /* Virtua
ce00: 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
ce10: 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  coded */..  asse
ce20: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
ce30: 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69  N );.  mustBeUni
ce40: 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26  que = (inFlags &
ce50: 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21   IN_INDEX_LOOP)!
ce60: 3d 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  =0;..  /* Check 
ce70: 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69  to see if an exi
ce80: 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
ce90: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
cea0: 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79   to.  ** satisfy
ceb0: 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
cec0: 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20  s is preferable 
ced0: 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  to generating a 
cee0: 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65  new .  ** epheme
cef0: 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ral table..  */.
cf00: 20 20 70 20 3d 20 28 45 78 70 72 48 61 73 50 72    p = (ExprHasPr
cf10: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
cf20: 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78  sSelect) ? pX->x
cf30: 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20  .pSelect : 0);. 
cf40: 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 72   if( ALWAYS(pPar
cf50: 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20  se->nErr==0) && 
cf60: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
cf70: 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71  Opt(p) ){.    sq
cf80: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
cf90: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
cfa0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
cfb0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
cfc0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
cff0: 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
d000: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20     Expr *pExpr; 
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
d030: 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e  ression <column>
d040: 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 43 6f 6c   */.    i16 iCol
d050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d070: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
d080: 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20  n <column> */.  
d090: 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20    i16 iDb;      
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
d0c0: 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61  base idx for pTa
d0d0: 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  b */..    assert
d0e0: 28 20 70 20 29 3b 20 20 20 20 20 20 20 20 20 20  ( p );          
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d100: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
d110: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
d120: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
d130: 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
d140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
d150: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
d160: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
d170: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
d180: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ( p->pEList->a[0
d190: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a  ].pExpr!=0 ); /*
d1a0: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
d1b0: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
d1c0: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
d1d0: 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20  ( p->pSrc!=0 ); 
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d1f0: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
d200: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
d210: 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d  p) */.    pTab =
d220: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
d230: 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20 3d  Tab;.    pExpr =
d240: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
d250: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c  .pExpr;.    iCol
d260: 20 3d 20 28 69 31 36 29 70 45 78 70 72 2d 3e 69   = (i16)pExpr->i
d270: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20  Column;.   .    
d280: 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72  /* Code an OP_Tr
d290: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50  ansaction and OP
d2a0: 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c  _TableLock for <
d2b0: 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
d2c0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
d2d0: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
d2e0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
d2f0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
d300: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
d310: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
d320: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
d330: 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
d340: 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
d350: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Name);..    /* T
d360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d370: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
d380: 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20   two places. In 
d390: 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76  both cases the v
d3a0: 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61  dbe.    ** has a
d3b0: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
d3c0: 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65  cated. So assume
d3d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
d3e0: 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  ) is always.    
d3f0: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65  ** successful he
d400: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
d410: 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66  ssert(v);.    if
d420: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
d430: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
d440: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
d450: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 56 64 62  arse);.      Vdb
d460: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
d470: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
d480: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
d490: 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
d4a0: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
d4b0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
d4c0: 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20  DEX_ROWID;..    
d4d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d4e0: 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
d4f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d500: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
d530: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a  or variable */..
d540: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
d550: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
d560: 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70  used by the comp
d570: 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e  arison. If an in
d580: 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20  dex is to.      
d590: 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  ** be used in pl
d5a0: 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61  ace of a temp-ta
d5b0: 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ble, it must be 
d5c0: 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e  ordered accordin
d5d0: 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  g.      ** to th
d5e0: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
d5f0: 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20  uence.  */.     
d600: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
d610: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
d620: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
d630: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
d640: 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f  pExpr);..      /
d650: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
d660: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77   affinity that w
d670: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70  ill be used to p
d680: 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20  erform the .    
d690: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
d6a0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
d6b0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
d6c0: 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20  he column. If.  
d6d0: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74      ** it is not
d6e0: 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
d6f0: 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20  ible to use any 
d700: 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a  index..      */.
d710: 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69        int affini
d720: 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
d730: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
d740: 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  X, pTab->aCol[iC
d750: 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a 0a  ol].affinity);..
d760: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
d770: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
d780: 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26  x && eType==0 &&
d790: 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49   affinity_ok; pI
d7a0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
d7b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49  .        if( (pI
d7c0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
d7d0: 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20  =iCol).         
d7e0: 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  && sqlite3FindCo
d7f0: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
d800: 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  ), pIdx->azColl[
d810: 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20  0], 0)==pReq.   
d820: 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42        && (!mustB
d830: 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78  eUnique || (pIdx
d840: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20  ->nKeyCol==1 && 
d850: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
d860: 64 78 29 29 29 0a 20 20 20 20 20 20 20 20 29 7b  dx))).        ){
d870: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
d880: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
d890: 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20  deOnce(pParse); 
d8a0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d8b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d8c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d8d0: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
d8e0: 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  b, pIdx->tnum, i
d8f0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Db);.          s
d900: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
d910: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
d920: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
d930: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
d940: 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
d950: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  e));.          a
d960: 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f  ssert( IN_INDEX_
d970: 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e  INDEX_DESC == IN
d980: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
d990: 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
d9a0: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
d9b0: 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64  _INDEX_ASC + pId
d9c0: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
d9d0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
d9e0: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21   prNotFound && !
d9f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
da00: 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  .notNull ){.    
da10: 20 20 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f          *prNotFo
da20: 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  und = ++pParse->
da30: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
da40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
da50: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
da60: 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b  0, *prNotFound);
da70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
da80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
da90: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
daa0: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ddr);.        }.
dab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dac0: 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  }..  if( eType==
dad0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c  0 ){.    /* Coul
dae0: 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78  d not find an ex
daf0: 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20  isting table or 
db00: 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20  index to use as 
db10: 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a  the RHS b-tree..
db20: 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68      ** We will h
db30: 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  ave to generate 
db40: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
db50: 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62  le to do the job
db60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32  ..    */.    u32
db70: 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
db80: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
db90: 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72  yLoop;.    int r
dba0: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b  MayHaveNull = 0;
dbb0: 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
dbc0: 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69  INDEX_EPH;.    i
dbd0: 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  f( inFlags & IN_
dbe0: 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20  INDEX_LOOP ){.  
dbf0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
dc00: 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20  ryLoop = 0;.    
dc10: 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d    if( pX->pLeft-
dc20: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45  >iColumn<0 && !E
dc30: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
dc40: 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
dc50: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70   ){.        eTyp
dc60: 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
dc70: 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ID;.      }.    
dc80: 7d 65 6c 73 65 20 69 66 28 20 70 72 4e 6f 74 46  }else if( prNotF
dc90: 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 70  ound ){.      *p
dca0: 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79  rNotFound = rMay
dcb0: 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  HaveNull = ++pPa
dcc0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
dcd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dce0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
dcf0: 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b  , rMayHaveNull);
dd00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
dd10: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
dd20: 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79  pParse, pX, rMay
dd30: 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d  HaveNull, eType=
dd40: 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29  =IN_INDEX_ROWID)
dd50: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51  ;.    pParse->nQ
dd60: 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64  ueryLoop = saved
dd70: 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65  NQueryLoop;.  }e
dd80: 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61  lse{.    pX->iTa
dd90: 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a  ble = iTab;.  }.
dda0: 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a    return eType;.
ddb0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
ddc0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
ddd0: 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72  r scalar subquer
dde0: 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75  ies used as a su
ddf0: 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f  bquery expressio
de00: 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72  n, EXISTS,.** or
de10: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20   IN operators.  
de20: 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
de30: 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52      (SELECT a FR
de40: 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d  OM b)          -
de50: 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  - subquery.**   
de60: 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54    EXISTS (SELECT
de70: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20   a FROM b)   -- 
de80: 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a  EXISTS subquery.
de90: 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35  **     x IN (4,5
dea0: 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20  ,11)            
deb0: 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
dec0: 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69   with list on ri
ded0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a  ght-hand side.**
dee0: 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
def0: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
df00: 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
df10: 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20  ith subquery on 
df20: 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20  the right.**.** 
df30: 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65  The pExpr parame
df40: 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68  ter describes th
df50: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
df60: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
df70: 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72  N.** operator or
df80: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
df90: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73   If parameter is
dfa0: 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
dfb0: 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69  o, then expressi
dfc0: 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72  on pExpr is guar
dfd0: 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
dfe0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f  of the form "<ro
dff0: 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f  wid> IN (?, ?, ?
e000: 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64  )", where <rowid
e010: 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  > is a reference
e020: 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65  .** to some inte
e030: 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f  ger key column o
e040: 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65  f a table B-Tree
e050: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
e060: 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79  use an.** intkey
e070: 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65   B-Tree to store
e080: 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e   the set of IN(.
e090: 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65  ..) values inste
e0a0: 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a  ad of the usual.
e0b0: 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69  ** (slower) vari
e0c0: 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73  able length keys
e0d0: 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49   B-Tree..**.** I
e0e0: 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69  f rMayHaveNull i
e0f0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74  s non-zero, that
e100: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
e110: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20  operation is an 
e120: 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c  IN.** (not a SEL
e130: 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20 61  ECT or EXISTS) a
e140: 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53 20  nd that the RHS 
e150: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e  might contains N
e160: 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69  ULLs..** All thi
e170: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69  s routine does i
e180: 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  s initialize the
e190: 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20   register given 
e1a0: 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a  by rMayHaveNull.
e1b0: 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c  ** to NULL.  Cal
e1c0: 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69  ling routines wi
e1d0: 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20  ll take care of 
e1e0: 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65  changing this re
e1f0: 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20  gister.** value 
e200: 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74  to non-NULL if t
e210: 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66  he RHS is NULL-f
e220: 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ree..**.** For a
e230: 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
e240: 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75  S operator, retu
e250: 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
e260: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a  that holds the.*
e270: 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49  * result.  For I
e280: 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69  N operators or i
e290: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
e2a0: 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  s, the return va
e2b0: 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66  lue is 0..*/.#if
e2c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e2d0: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
e2e0: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
e2f0: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
e300: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
e310: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
e320: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
e330: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
e340: 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c   The IN, SELECT,
e350: 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
e360: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d 61  tor */.  int rMa
e370: 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20 20  yHaveNull,      
e380: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61   /* Register tha
e390: 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  t records whethe
e3a0: 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e  r NULLs exist in
e3b0: 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73   RHS */.  int is
e3c0: 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
e3d0: 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48    /* If true, LH
e3e0: 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  S of IN operator
e3f0: 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29   is a rowid */.)
e400: 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72  {.  int testAddr
e410: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
e420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e430: 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
e440: 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52  ress */.  int rR
e450: 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74    /* Register st
e480: 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20  oring resulting 
e490: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
e4a0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
e4b0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56  arse);.  if( NEV
e4c0: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
e4d0: 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  n 0;.  sqlite3Ex
e4e0: 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
e4f0: 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  se);..  /* This 
e500: 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e  code must be run
e510: 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79   in its entirety
e520: 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69   every time it i
e530: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
e540: 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ** if any of the
e550: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
e560: 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
e570: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
e580: 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
e590: 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
e5a0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
e5b0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
e5c0: 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
e5d0: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
e5e0: 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
e5f0: 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
e600: 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
e610: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
e620: 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
e630: 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
e640: 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
e650: 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
e660: 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
e670: 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
e680: 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
e690: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
e6a0: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
e6b0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
e6c0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
e6d0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 74  Select) ){.    t
e6e0: 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  estAddr = sqlite
e6f0: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
e700: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
e710: 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  v);.  }..#ifndef
e720: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
e730: 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73  LAIN.  if( pPars
e740: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
e750: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
e760: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e770: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
e780: 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20 25  ->db, "EXECUTE %
e790: 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22  s%s SUBQUERY %d"
e7a0: 2c 20 74 65 73 74 41 64 64 72 3e 3d 30 3f 22 22  , testAddr>=0?""
e7b0: 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a  :"CORRELATED ",.
e7c0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
e7d0: 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a  p==TK_IN?"LIST":
e7e0: 22 53 43 41 4c 41 52 22 2c 20 70 50 61 72 73 65  "SCALAR", pParse
e7f0: 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a  ->iNextSelectId.
e800: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
e810: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
e820: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
e830: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
e840: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
e850: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64  NAMIC);.  }.#end
e860: 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  if..  switch( pE
e870: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
e880: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
e890: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
e8a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
e8b0: 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68  * Affinity of th
e8c0: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
e8d0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
e8e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
e8f0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e900: 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
e910: 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
e920: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
e930: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
e940: 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20  eft; /* the LHS 
e950: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
e960: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49  or */.      KeyI
e970: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
e980: 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69  0;      /* Key i
e990: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20  nformation */.. 
e9a0: 20 20 20 20 20 69 66 28 20 72 4d 61 79 48 61 76       if( rMayHav
e9b0: 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  eNull ){.       
e9c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e9d0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
e9e0: 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b  , rMayHaveNull);
e9f0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ea00: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
ea10: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
ea20: 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Left);..      /*
ea30: 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73   Whether this is
ea40: 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54   an 'x IN(SELECT
ea50: 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49  ...)' or an 'x I
ea60: 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20  N(<exprlist>)'. 
ea70: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
ea80: 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64  on it is handled
ea90: 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20   the same way.  
eaa0: 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  An ephemeral tab
eab0: 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  le is .      ** 
eac0: 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67  filled with sing
ead0: 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b  le-field index k
eae0: 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67  eys representing
eaf0: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
eb00: 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53     ** from the S
eb10: 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
eb20: 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
eb30: 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
eb40: 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
eb50: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
eb60: 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
eb70: 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
eb80: 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
eb90: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
eba0: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
ebb0: 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
ebc0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
ebd0: 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
ebe0: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
ebf0: 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
ec00: 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
ec10: 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
ec20: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
ec30: 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
ec40: 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
ec50: 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
ec60: 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
ec70: 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
ec80: 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
ec90: 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
eca0: 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
ecb0: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
ecc0: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
ecd0: 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a  affinity.      *
ece0: 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
ecf0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
ed00: 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
ed10: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
ed20: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
ed30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
ed40: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45  penEphemeral, pE
ed50: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73  xpr->iTable, !is
ed60: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70 4b  Rowid);.      pK
ed70: 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64  eyInfo = isRowid
ed80: 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65   ? 0 : sqlite3Ke
ed90: 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
eda0: 65 2d 3e 64 62 2c 20 31 2c 20 31 29 3b 0a 0a 20  e->db, 1, 1);.. 
edb0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
edc0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
edd0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
ede0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
edf0: 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
ee00: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
ee10: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
ee20: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
ee30: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
ee40: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
ee50: 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
ee60: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
ee70: 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
ee80: 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
ee90: 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
eea0: 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
eeb0: 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e  Select = pExpr->
eec0: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
eed0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
eee0: 73 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  st;.        Expr
eef0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20  List *pEList;.. 
ef00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
ef10: 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  isRowid );.     
ef20: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
ef30: 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
ef40: 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e  SRT_Set, pExpr->
ef50: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  iTable);.       
ef60: 20 64 65 73 74 2e 61 66 66 53 64 73 74 20 3d 20   dest.affSdst = 
ef70: 28 75 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20  (u8)affinity;.  
ef80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
ef90: 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30  Expr->iTable&0x0
efa0: 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d  000FFFF)==pExpr-
efb0: 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  >iTable );.     
efc0: 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d     pSelect->iLim
efd0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
efe0: 74 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63  testcase( pSelec
eff0: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
f000: 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
f010: 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 73 65       pSelect->se
f020: 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
f030: 73 74 69 6e 63 74 3b 0a 20 20 20 20 20 20 20 20  stinct;.        
f040: 74 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e  testcase( pKeyIn
f050: 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73  fo==0 ); /* Caus
f060: 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c  ed by OOM in sql
f070: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
f080: 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  () */.        if
f090: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
f0a0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
f0b0: 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
f0c0: 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
f0d0: 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
f0e0: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  o);.          re
f0f0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
f100: 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  }.        pEList
f110: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
f120: 73 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  st;.        asse
f130: 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20  rt( pKeyInfo!=0 
f140: 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63  ); /* OOM will c
f150: 61 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20  ause exit after 
f160: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
f170: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
f180: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
f190: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f1a0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
f1b0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
f1c0: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
f1d0: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
f1e0: 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
f1f0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
f200: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[0] = sqlite3Bi
f210: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
f220: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
f230: 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20  ->pLeft,.       
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70    pEList->a[0].p
f280: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
f290: 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
f2a0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29  xpr->x.pList!=0)
f2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
f2c0: 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20  ase 2:     expr 
f2d0: 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20  IN (exprlist).  
f2e0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
f2f0: 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   ** For each exp
f300: 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
f310: 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
f320: 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
f330: 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
f340: 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
f350: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
f360: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
f370: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
f380: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
f390: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
f3a0: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
f3b0: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
f3c0: 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
f3d0: 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
f3e0: 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
f3f0: 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
f400: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
f410: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
f420: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
f430: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
f440: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
f450: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
f460: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20          int r1, 
f470: 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20  r2, r3;..       
f480: 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
f490: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
f4a0: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
f4b0: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
f4c0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  }.        if( pK
f4d0: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
f4e0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
f4f0: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
f500: 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
f510: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  );.          pKe
f520: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20  yInfo->aColl[0] 
f530: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
f540: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
f550: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
f560: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
f570: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65  * Loop through e
f580: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
f590: 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f  n <exprlist>. */
f5a0: 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
f5b0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
f5c0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
f5d0: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
f5e0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
f5f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52  .        if( isR
f600: 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 56 64  owid ) sqlite3Vd
f610: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
f620: 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20  ull, 0, r2);.   
f630: 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74       for(i=pList
f640: 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
f650: 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
f660: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
f670: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
f680: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
f690: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
f6a0: 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20  ValToIns;..     
f6b0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
f6c0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
f6d0: 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
f6e0: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
f6f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
f700: 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
f710: 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
f720: 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
f730: 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
f740: 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
f750: 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
f760: 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
f770: 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
f780: 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
f790: 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
f7a0: 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
f7b0: 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
f7c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
f7d0: 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e 3d    if( testAddr>=
f7e0: 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
f7f0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
f800: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f810: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
f820: 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41  eToNoop(v, testA
f830: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
f840: 20 20 74 65 73 74 41 64 64 72 20 3d 20 2d 31 3b    testAddr = -1;
f850: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
f860: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
f870: 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
f880: 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
f890: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
f8a0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
f8b0: 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26    if( isRowid &&
f8c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
f8d0: 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c  teger(pE2, &iVal
f8e0: 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20  ToIns) ){.      
f8f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f900: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
f910: 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e  sertInt, pExpr->
f920: 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c  iTable, r2, iVal
f930: 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  ToIns);.        
f940: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f950: 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
f960: 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
f970: 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
f980: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
f990: 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
f9a0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f9b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f9c0: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33  OP_MustBeInt, r3
f9d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
fa00: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
fa20: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
fa40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fa50: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78  , OP_Insert, pEx
fa60: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
fa70: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r3);.           
fa80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fa90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
faa0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
fab0: 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c  keRecord, r3, 1,
fac0: 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
fad0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
fae0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
faf0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
fb00: 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b  (pParse, r3, 1);
fb10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
fb20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fb30: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
fb40: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
fb50: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r2);.          
fb60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
fb70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fb80: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
fb90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
fba0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
fbb0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
fbc0: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
fbd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
fbe0: 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
fbf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fc00: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
fc10: 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49  r, (void *)pKeyI
fc20: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
fc30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fc40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
fc50: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
fc60: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
fc70: 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c  LECT:.    defaul
fc80: 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  t: {.      /* If
fc90: 20 74 68 69 73 20 68 61 73 20 74 6f 20 62 65 20   this has to be 
fca0: 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e  a scalar SELECT.
fcb0: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
fcc0: 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20  to put the.     
fcd0: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69   ** value of thi
fce0: 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65  s select in a me
fcf0: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65  mory cell and re
fd00: 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a  cord the number.
fd10: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
fd20: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69  memory cell in i
fd30: 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73  Column.  If this
fd40: 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77   is an EXISTS, w
fd50: 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  rite.      ** an
fd60: 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20   integer 0 (not 
fd70: 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78  exists) or 1 (ex
fd80: 69 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d  ists) into a mem
fd90: 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a  ory cell.      *
fda0: 2a 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61  * and record tha
fdb0: 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  t memory cell in
fdc0: 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20   iColumn..      
fdd0: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
fde0: 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20  *pSel;          
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fe00: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
fe10: 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a  nt to encode */.
fe20: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
fe30: 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20   dest;          
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
fe50: 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ow to deal with 
fe60: 53 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f  SELECt result */
fe70: 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
fe80: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
fe90: 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
fea0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
feb0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
fec0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fed0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
fee0: 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  ISTS || pExpr->o
fef0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
ff00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
ff10: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ff20: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
ff30: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53 65  ct) );.      pSe
ff40: 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
ff50: 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  lect;.      sqli
ff60: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
ff70: 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50  t(&dest, 0, ++pP
ff80: 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20  arse->nMem);.   
ff90: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
ffa0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
ffb0: 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73         dest.eDes
ffc0: 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20  t = SRT_Mem;.   
ffd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ffe0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
fff0: 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61  l, 0, dest.iSDPa
10000 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  rm);.        Vdb
10010 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
10020 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75  it subquery resu
10030 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lt"));.      }el
10040 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74  se{.        dest
10050 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69  .eDest = SRT_Exi
10060 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
10070 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10080 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
10090 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
100a0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
100b0 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58  ent((v, "Init EX
100c0 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a  ISTS result"));.
100d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
100e0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
100f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c  pParse->db, pSel
10100 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
10110 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSel->pLimit = 
10120 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
10130 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  rse, TK_INTEGER,
10140 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 20 20 20 20 20 20 26 73 71 6c 69 74 65           &sqlite
10170 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a  3IntTokens[1]);.
10180 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d        pSel->iLim
10190 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  it = 0;.      if
101a0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
101b0 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64  pParse, pSel, &d
101c0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
101d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
101e0 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20 64  }.      rReg = d
101f0 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
10200 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
10210 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
10220 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
10230 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10240 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64 64  }..  if( testAdd
10250 72 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r>=0 ){.    sqli
10260 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
10270 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20  v, testAddr);.  
10280 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
10290 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
102a0 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b  ..  return rReg;
102b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
102c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
102d0 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
102e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
102f0 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
10300 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e  e code for an IN
10310 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
10320 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  **      x IN (SE
10330 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20  LECT ...).**    
10340 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76    x IN (value, v
10350 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  alue, ...).**.**
10360 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   The left-hand s
10370 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73  ide (LHS) is a s
10380 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
10390 2e 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  .  The right-han
103a0 64 20 73 69 64 65 20 28 52 48 53 29 0a 2a 2a 20  d side (RHS).** 
103b0 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a  is an array of z
103c0 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75  ero or more valu
103d0 65 73 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  es.  The express
103e0 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74  ion is true if t
103f0 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e  he LHS is.** con
10400 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
10410 65 20 52 48 53 2e 20 20 54 68 65 20 76 61 6c 75  e RHS.  The valu
10420 65 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  e of the express
10430 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28  ion is unknown (
10440 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20  NULL).** if the 
10450 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69  LHS is NULL or i
10460 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
10470 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
10480 6e 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68  n the RHS and th
10490 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e  e.** RHS contain
104a0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
104b0 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
104c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
104d0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 77 69 6c  nerates code wil
104e0 6c 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  l jump to destIf
104f0 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53  False if the LHS
10500 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74   is not .** cont
10510 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
10520 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f   RHS.  If due to
10530 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74   NULLs we cannot
10540 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
10550 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74  e LHS.** is cont
10560 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
10570 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65   then jump to de
10580 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
10590 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e  e LHS is contain
105a0 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
105b0 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74   RHS then fall t
105c0 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69  hrough..*/.stati
105d0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
105e0 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73  prCodeIN(.  Pars
105f0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10600 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
10610 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
10620 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
10630 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
10640 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78      /* The IN ex
10650 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
10660 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20  t destIfFalse,  
10670 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
10680 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63   if LHS is not c
10690 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
106a0 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  RHS */.  int des
106b0 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f  tIfNull        /
106c0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
106d0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75  he results are u
106e0 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55  nknown due to NU
106f0 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  LLs */.){.  int 
10700 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
10710 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
10720 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48  at is true if RH
10730 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  S contains NULL 
10740 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72  values */.  char
10750 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
10760 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
10770 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  affinity to use 
10780 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20  */.  int eType; 
10790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
107a0 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f  pe of the RHS */
107b0 0a 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20  .  int r1;      
107c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
107d0 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
107e0 65 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  er */.  Vdbe *v;
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10800 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   Statement under
10810 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
10820 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
10830 68 65 20 52 48 53 2e 20 20 20 41 66 74 65 72 20  he RHS.   After 
10840 74 68 69 73 20 73 74 65 70 2c 20 74 68 65 20 74  this step, the t
10850 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
10860 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61  .  ** pExpr->iTa
10870 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ble will contain
10880 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61  s the values tha
10890 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48  t make up the RH
108a0 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50  S..  */.  v = pP
108b0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
108c0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
108d0 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65       /* OOM dete
108e0 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  cted prior to th
108f0 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
10900 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
10910 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78  (v, "begin IN ex
10920 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d  pr"));.  eType =
10930 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
10940 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
10950 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  r, 0,.          
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10970 20 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d     destIfFalse==
10980 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a  destIfNull ? 0 :
10990 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a   &rRhsHasNull);.
109a0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
109b0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
109c0 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
109d0 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
109e0 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68  sults.  ** of th
109f0 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66  e expression. af
10a00 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73  finityStr stores
10a10 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
10a20 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20   suitable for.  
10a30 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65  ** P4 of OP_Make
10a40 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61  Record..  */.  a
10a50 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72  ffinity = compar
10a60 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
10a70 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  pr);..  /* Code 
10a80 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
10a90 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
10aa0 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f   IN (...)"..  */
10ab0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
10ac0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
10ad0 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
10ae0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
10af0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
10b00 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
10b10 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a  pr->pLeft, r1);.
10b20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53  .  /* If the LHS
10b30 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
10b40 68 65 20 72 65 73 75 6c 74 20 69 73 20 65 69 74  he result is eit
10b50 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c  her false or NUL
10b60 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  L depending.  **
10b70 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 20   on whether the 
10b80 52 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72 20  RHS is empty or 
10b90 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c  not, respectivel
10ba0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  y..  */.  if( de
10bb0 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
10bc0 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 2f 2a 20  False ){.    /* 
10bd0 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65  Shortcut for the
10be0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
10bf0 72 65 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64  re the false and
10c00 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61   NULL outcomes a
10c10 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  re.    ** the sa
10c20 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  me. */.    sqlit
10c30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10c40 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64  OP_IsNull, r1, d
10c50 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65  estIfNull); Vdbe
10c60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
10c70 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64  else{.    int ad
10c80 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
10c90 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
10ca0 74 4e 75 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65  tNull, r1); Vdbe
10cb0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10cd0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
10ce0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
10cf0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
10d00 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
10d10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10d20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
10d30 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75  oto, 0, destIfNu
10d40 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
10d50 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10d60 61 64 64 72 31 29 3b 0a 20 20 7d 0a 0a 20 20 69  addr1);.  }..  i
10d70 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
10d80 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
10d90 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
10da0 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20   the RHS is the 
10db0 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62  ROWID of table b
10dc0 2d 74 72 65 65 0a 20 20 20 20 2a 2f 0a 20 20 20  -tree.    */.   
10dd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10de0 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
10df0 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61  nt, r1, destIfFa
10e00 6c 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  lse); VdbeCovera
10e10 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
10e20 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10e30 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45  OP_NotExists, pE
10e40 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
10e50 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b 0a 20  tIfFalse, r1);. 
10e60 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
10e70 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
10e80 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
10e90 2c 20 74 68 65 20 52 48 53 20 69 73 20 61 6e 20  , the RHS is an 
10ea0 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20 20  index b-tree..  
10eb0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
10ec0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
10ed0 5f 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 31  _Affinity, r1, 1
10ee0 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20  , 0, &affinity, 
10ef0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  1);..    /* If t
10f00 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  he set membershi
10f10 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68  p test fails, th
10f20 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
10f30 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 78 20   the .    ** "x 
10f40 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73  IN (...)" expres
10f50 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74  sion must be eit
10f60 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49  her 0 or NULL. I
10f70 66 20 74 68 65 20 73 65 74 0a 20 20 20 20 2a 2a  f the set.    **
10f80 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
10f90 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74  L values, then t
10fa0 68 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e 20  he result is 0. 
10fb0 49 66 20 74 68 65 20 73 65 74 20 0a 20 20 20 20  If the set .    
10fc0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ** contains one 
10fd0 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
10fe0 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ues, then the re
10ff0 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20  sult of the.    
11000 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ** expression is
11010 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20   also NULL..    
11020 2a 2f 0a 20 20 20 20 69 66 28 20 72 52 68 73 48  */.    if( rRhsH
11030 61 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20 64 65 73  asNull==0 || des
11040 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
11050 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Null ){.      /*
11060 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
11070 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e  s if it is known
11080 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
11090 20 74 68 61 74 20 74 68 65 20 52 48 53 0a 20 20   that the RHS.  
110a0 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f      ** cannot co
110b0 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65  ntain NULL value
110c0 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  s. This happens 
110d0 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  as the result.  
110e0 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54      ** of a "NOT
110f0 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
11100 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
11110 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 20 20  e schema..      
11120 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f  **.      ** Also
11130 20 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68   run this branch
11140 20 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69   if NULL is equi
11150 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a  valent to FALSE.
11160 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69        ** for thi
11170 73 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20  s particular IN 
11180 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20 20  operator..      
11190 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
111a0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
111b0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45   OP_NotFound, pE
111c0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
111d0 74 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 31 29  tIfFalse, r1, 1)
111e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
111f0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c  rage(v);.    }el
11200 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
11210 74 68 69 73 20 62 72 61 6e 63 68 2c 20 74 68 65  this branch, the
11220 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6d   RHS of the IN m
11230 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
11240 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ULL and.      **
11250 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
11260 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52   a NULL on the R
11270 48 53 20 6d 61 6b 65 73 20 61 20 64 69 66 66 65  HS makes a diffe
11280 72 65 6e 63 65 20 69 6e 20 74 68 65 0a 20 20 20  rence in the.   
11290 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20     ** outcome.. 
112a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
112b0 74 20 6a 31 2c 20 6a 32 3b 0a 0a 20 20 20 20 20  t j1, j2;..     
112c0 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   /* First check 
112d0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48  to see if the LH
112e0 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  S is contained i
112f0 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 73  n the RHS.  If s
11300 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  o,.      ** then
11310 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
11320 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48   NULLs in the RH
11330 53 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  S does not matte
11340 72 2c 20 73 6f 20 6a 75 6d 70 0a 20 20 20 20 20  r, so jump.     
11350 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20   ** over all of 
11360 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f  the code that fo
11370 6c 6c 6f 77 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  llows..      */.
11380 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
11390 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
113a0 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
113b0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72  pr->iTable, 0, r
113c0 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62  1, 1);.      Vdb
113d0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
113e0 20 20 20 20 20 2f 2a 20 48 65 72 65 20 77 65 20       /* Here we 
113f0 62 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  begin generating
11400 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
11410 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
11420 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61  t.      ** conta
11430 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
11440 52 48 53 2e 20 20 47 65 6e 65 72 61 74 65 20 61  RHS.  Generate a
11450 64 64 69 74 69 6f 6e 61 6c 20 63 6f 64 65 20 74  dditional code t
11460 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 65 73  hat.      ** tes
11470 74 73 20 74 68 65 20 52 48 53 20 66 6f 72 20 4e  ts the RHS for N
11480 55 4c 4c 73 2e 20 20 49 66 20 74 68 65 20 52 48  ULLs.  If the RH
11490 53 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c  S contains a NUL
114a0 4c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  L then.      ** 
114b0 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75  jump to destIfNu
114c0 6c 6c 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ll.  If there ar
114d0 65 20 6e 6f 20 4e 55 4c 4c 73 20 69 6e 20 74 68  e no NULLs in th
114e0 65 20 52 48 53 20 74 68 65 6e 0a 20 20 20 20 20  e RHS then.     
114f0 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74   ** jump to dest
11500 49 66 46 61 6c 73 65 2e 0a 20 20 20 20 20 20 2a  IfFalse..      *
11510 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
11520 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11530 49 66 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  If, rRhsHasNull,
11540 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64   destIfNull); Vd
11550 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
11560 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11570 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
11580 6f 74 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  ot, rRhsHasNull,
11590 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 20 56   destIfFalse); V
115a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
115b0 20 20 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74        j2 = sqlit
115c0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
115d0 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
115e0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72  pr->iTable, 0, r
115f0 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a  RhsHasNull, 1);.
11600 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
11610 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
11620 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11630 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
11640 20 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20   rRhsHasNull);. 
11650 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11660 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
11670 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73  o, 0, destIfFals
11680 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
11690 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
116a0 20 6a 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   j2);.      sqli
116b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
116c0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
116d0 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20  rRhsHasNull);.  
116e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
116f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
11700 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  , 0, destIfNull)
11710 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
11720 4f 50 5f 46 6f 75 6e 64 20 61 74 20 74 68 65 20  OP_Found at the 
11730 74 6f 70 20 6f 66 20 74 68 69 73 20 62 72 61 6e  top of this bran
11740 63 68 20 6a 75 6d 70 73 20 68 65 72 65 20 77 68  ch jumps here wh
11750 65 6e 20 74 72 75 65 2c 20 0a 20 20 20 20 20 20  en true, .      
11760 2a 2a 20 63 61 75 73 69 6e 67 20 74 68 65 20 6f  ** causing the o
11770 76 65 72 61 6c 6c 20 49 4e 20 65 78 70 72 65 73  verall IN expres
11780 73 69 6f 6e 20 65 76 61 6c 75 61 74 69 6f 6e 20  sion evaluation 
11790 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  to fall through.
117a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
117b0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
117c0 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
117d0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
117e0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
117f0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c  arse, r1);.  sql
11800 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
11810 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64 62 65  (pParse);.  Vdbe
11820 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
11830 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23   IN expr"));.}.#
11840 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11850 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
11860 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ../*.** Duplicat
11870 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c 75  e an 8-byte valu
11880 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e.*/.static char
11890 20 2a 64 75 70 38 62 79 74 65 73 28 56 64 62 65   *dup8bytes(Vdbe
118a0 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
118b0 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75  *in){.  char *ou
118c0 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
118d0 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64  locRaw(sqlite3Vd
118e0 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20 69  beDb(v), 8);.  i
118f0 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65  f( out ){.    me
11900 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29  mcpy(out, in, 8)
11910 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
11920 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ut;.}..#ifndef S
11930 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
11940 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20  ING_POINT./*.** 
11950 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
11960 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
11970 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69  l put the floati
11980 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
11990 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a  e described by z
119a0 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
119b0 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
119c0 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e  ** The z[] strin
119d0 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  g will probably 
119e0 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d  not be zero-term
119f0 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65  inated.  But the
11a00 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63   .** z[n] charac
11a10 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  ter is guarantee
11a20 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  d to be somethin
11a30 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  g that does not 
11a40 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65  look.** like the
11a50 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66   continuation of
11a60 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a   the number..*/.
11a70 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
11a80 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f  Real(Vdbe *v, co
11a90 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
11aa0 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74   negateFlag, int
11ab0 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c   iMem){.  if( AL
11ac0 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20  WAYS(z!=0) ){.  
11ad0 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a    double value;.
11ae0 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
11af0 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c    sqlite3AtoF(z,
11b00 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33   &value, sqlite3
11b10 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
11b20 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61  ITE_UTF8);.    a
11b30 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49  ssert( !sqlite3I
11b40 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f  sNaN(value) ); /
11b50 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e  * The new AtoF n
11b60 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e  ever returns NaN
11b70 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61   */.    if( nega
11b80 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  teFlag ) value =
11b90 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20   -value;.    zV 
11ba0 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28  = dup8bytes(v, (
11bb0 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20  char*)&value);. 
11bc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11bd0 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  dOp4(v, OP_Real,
11be0 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
11bf0 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d   P4_REAL);.  }.}
11c00 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
11c10 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
11c20 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
11c30 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
11c40 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
11c50 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
11c60 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
11c70 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75  em..**.** Expr.u
11c80 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79  .zToken is alway
11c90 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d  s UTF8 and zero-
11ca0 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73  terminated..*/.s
11cb0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
11cc0 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50  nteger(Parse *pP
11cd0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
11ce0 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20  r, int negFlag, 
11cf0 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62  int iMem){.  Vdb
11d00 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
11d10 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70  Vdbe;.  if( pExp
11d20 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
11d30 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
11d40 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
11d50 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72  Value;.    asser
11d60 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  t( i>=0 );.    i
11d70 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d  f( negFlag ) i =
11d80 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -i;.    sqlite3
11d90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11da0 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65  _Integer, i, iMe
11db0 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
11dc0 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20   int c;.    i64 
11dd0 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74  value;.    const
11de0 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72   char *z = pExpr
11df0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
11e00 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
11e10 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44      c = sqlite3D
11e20 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20  ecOrHexToI64(z, 
11e30 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28  &value);.    if(
11e40 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26   c==0 || (c==2 &
11e50 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20  & negFlag) ){.  
11e60 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
11e70 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
11e80 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20  ){ value = c==2 
11e90 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
11ea0 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20   : -value; }.   
11eb0 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65     zV = dup8byte
11ec0 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c  s(v, (char*)&val
11ed0 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ue);.      sqlit
11ee0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
11ef0 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65  OP_Int64, 0, iMe
11f00 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54  m, 0, zV, P4_INT
11f10 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  64);.    }else{.
11f20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
11f30 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
11f40 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  T.      sqlite3E
11f50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f60 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67  "oversized integ
11f70 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c  er: %s%s", negFl
11f80 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a  ag ? "-" : "", z
11f90 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66  );.#else.#ifndef
11fa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58   SQLITE_OMIT_HEX
11fb0 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69  _INTEGER.      i
11fc0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
11fd0 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30  cmp(z,"0x",2)==0
11fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11ff0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12000 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c  se, "hex literal
12010 20 74 6f 6f 20 62 69 67 3a 20 25 73 22 2c 20 7a   too big: %s", z
12020 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
12030 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
12040 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
12050 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d  , z, negFlag, iM
12060 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  em);.      }.#en
12070 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  dif.    }.  }.}.
12080 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63  ./*.** Clear a c
12090 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73  ache entry..*/.s
120a0 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 68 65  tatic void cache
120b0 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73 65  EntryClear(Parse
120c0 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
120d0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a   yColCache *p){.
120e0 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67    if( p->tempReg
120f0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
12100 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
12110 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
12120 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
12130 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
12140 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
12150 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67  Reg++] = p->iReg
12160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74  ;.    }.    p->t
12170 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a  empReg = 0;.  }.
12180 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  }.../*.** Record
12190 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   in the column c
121a0 61 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74  ache that a part
121b0 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72  icular column fr
121c0 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c  om a.** particul
121d0 61 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72  ar table is stor
121e0 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c  ed in a particul
121f0 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ar register..*/.
12200 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
12210 43 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65  CacheStore(Parse
12220 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
12230 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e  ab, int iCol, in
12240 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
12250 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a  ;.  int minLru;.
12260 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20    int idxLru;.  
12270 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
12280 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
12290 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a 20 52 65  iReg>0 );  /* Re
122a0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61  gister numbers a
122b0 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69  re always positi
122c0 76 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ve */.  assert( 
122d0 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c  iCol>=-1 && iCol
122e0 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69  <32768 );  /* Fi
122f0 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  nite column numb
12300 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ers */..  /* The
12310 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
12320 63 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65  che flag disable
12330 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  s the column cac
12340 68 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  he.  This is use
12350 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69  d.  ** for testi
12360 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72  ng only - to ver
12370 69 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20  ify that SQLite 
12380 61 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20  always gets the 
12390 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a  same answer.  **
123a0 20 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75   with and withou
123b0 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  t the column cac
123c0 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f  he..  */.  if( O
123d0 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
123e0 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  led(pParse->db, 
123f0 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
12400 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  he) ) return;.. 
12410 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63   /* First replac
12420 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65  e any existing e
12430 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
12440 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61  Actually, the wa
12450 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  y the column cac
12460 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  he is currently 
12470 75 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61  used, we are gua
12480 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61  ranteed.  ** tha
12490 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c  t the object wil
124a0 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20  l never already 
124b0 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65  be in cache.  Ve
124c0 72 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e  rify this guaran
124d0 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  tee..  */.#ifnde
124e0 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69  f NDEBUG.  for(i
124f0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
12500 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
12510 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
12520 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73  +, p++){.    ass
12530 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20  ert( p->iReg==0 
12540 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54  || p->iTable!=iT
12550 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e  ab || p->iColumn
12560 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65  !=iCol );.  }.#e
12570 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  ndif..  /* Find 
12580 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e  an empty slot an
12590 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a  d replace it */.
125a0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
125b0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
125c0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
125d0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
125e0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d      if( p->iReg=
125f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  =0 ){.      p->i
12600 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
12610 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20  iCacheLevel;.   
12620 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69     p->iTable = i
12630 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43  Tab;.      p->iC
12640 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
12650 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52      p->iReg = iR
12660 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d  eg;.      p->tem
12670 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  pReg = 0;.      
12680 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
12690 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
126a0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
126b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c  }.  }..  /* Repl
126c0 61 63 65 20 74 68 65 20 6c 61 73 74 20 72 65 63  ace the last rec
126d0 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20  ently used */.  
126e0 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66  minLru = 0x7ffff
126f0 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20  fff;.  idxLru = 
12700 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  -1;.  for(i=0, p
12710 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
12720 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
12730 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
12740 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c  +){.    if( p->l
12750 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20  ru<minLru ){.   
12760 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20     idxLru = i;. 
12770 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d       minLru = p-
12780 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >lru;.    }.  }.
12790 20 20 69 66 28 20 41 4c 57 41 59 53 28 69 64 78    if( ALWAYS(idx
127a0 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70  Lru>=0) ){.    p
127b0 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
127c0 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20  Cache[idxLru];. 
127d0 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70     p->iLevel = p
127e0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
127f0 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c  el;.    p->iTabl
12800 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  e = iTab;.    p-
12810 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
12820 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69  .    p->iReg = i
12830 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70  Reg;.    p->temp
12840 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Reg = 0;.    p->
12850 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
12860 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72  acheCnt++;.    r
12870 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  eturn;.  }.}../*
12880 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
12890 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74 77  t registers betw
128a0 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e  een iReg..iReg+n
128b0 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20  Reg-1 are being 
128c0 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20  overwritten..** 
128d0 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65 20  Purge the range 
128e0 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72 6f  of registers fro
128f0 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
12900 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  he..*/.void sqli
12910 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
12920 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
12930 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
12940 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nReg){.  int i;.
12950 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20 69 52    int iLast = iR
12960 65 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a 20  eg + nReg - 1;. 
12970 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
12980 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
12990 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
129a0 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
129b0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
129c0 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20  p++){.    int r 
129d0 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
129e0 66 28 20 72 3e 3d 69 52 65 67 20 26 26 20 72 3c  f( r>=iReg && r<
129f0 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  =iLast ){.      
12a00 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
12a10 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
12a20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20    p->iReg = 0;. 
12a30 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12a40 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63  * Remember the c
12a50 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61  urrent column ca
12a60 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e  che context.  An
12a70 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64  y new entries ad
12a80 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  ded.** added to 
12a90 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
12aa0 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c   after this call
12ab0 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65   are removed whe
12ac0 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  n the.** corresp
12ad0 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72  onding pop occur
12ae0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
12af0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
12b00 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
12b10 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
12b20 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20  Level++;.#ifdef 
12b30 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
12b40 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
12b50 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
12b60 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
12b70 20 20 20 20 70 72 69 6e 74 66 28 22 50 55 53 48      printf("PUSH
12b80 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73   to %d\n", pPars
12b90 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b  e->iCacheLevel);
12ba0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
12bb0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d  *.** Remove from
12bc0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
12bd0 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68  e any entries th
12be0 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69  at were added si
12bf0 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70  nce the.** the p
12c00 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33 45  revious sqlite3E
12c10 78 70 72 43 61 63 68 65 50 75 73 68 20 6f 70 65  xprCachePush ope
12c20 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65  ration.  In othe
12c30 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65  r words, restore
12c40 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74 6f  .** the cache to
12c50 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
12c60 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20 6d  s in prior the m
12c70 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73 68 2e  ost recent Push.
12c80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12c90 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61 72  ExprCachePop(Par
12ca0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
12cb0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
12cc0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61  ColCache *p;.  a
12cd0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69  ssert( pParse->i
12ce0 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b  CacheLevel>=1 );
12cf0 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
12d00 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66  eLevel--;.#ifdef
12d10 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
12d20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
12d30 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
12d40 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
12d50 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50  .    printf("POP
12d60 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72    to %d\n", pPar
12d70 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29  se->iCacheLevel)
12d80 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  ;.  }.#endif.  f
12d90 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
12da0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
12db0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
12dc0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
12dd0 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20   if( p->iReg && 
12de0 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  p->iLevel>pParse
12df0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
12e00 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
12e10 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
12e20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
12e30 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
12e40 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  }../*.** When a 
12e50 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73  cached column is
12e60 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75   reused, make su
12e70 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69  re that its regi
12e80 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f  ster is.** no lo
12e90 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61  nger available a
12ea0 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65  s a temp registe
12eb0 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39  r.  ticket #3879
12ec0 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  :  that same.** 
12ed0 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62  register might b
12ee0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69  e in the cache i
12ef0 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
12f00 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f  s, so be sure to
12f10 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c  .** get them all
12f20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12f30 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12f40 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72  ePinRegister(Par
12f50 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
12f60 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
12f70 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
12f80 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
12f90 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
12fa0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
12fb0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
12fc0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
12fd0 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
12fe0 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
12ff0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
13000 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
13010 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63  e code to extrac
13020 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
13030 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
13040 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f  n of a table..*/
13050 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
13060 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
13070 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76  Table(.  Vdbe *v
13080 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
13090 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
130a0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62  ruction */.  Tab
130b0 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20  le *pTab,    /* 
130c0 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  The table contai
130d0 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a  ning the value *
130e0 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
130f0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
13100 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65   cursor.  Or the
13110 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57   PK cursor for W
13120 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a  ITHOUT ROWID */.
13130 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
13140 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
13150 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72  e column to extr
13160 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  act */.  int reg
13170 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72  Out      /* Extr
13180 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  act the value in
13190 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72  to this register
131a0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f   */.){.  if( iCo
131b0 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61  l<0 || iCol==pTa
131c0 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
131d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
131e0 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
131f0 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b  TabCur, regOut);
13200 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
13210 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c  t op = IsVirtual
13220 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c  (pTab) ? OP_VCol
13230 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b  umn : OP_Column;
13240 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f  .    int x = iCo
13250 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52  l;.    if( !HasR
13260 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
13270 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43      x = sqlite3C
13280 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c  olumnOfIndex(sql
13290 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
132a0 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29  dex(pTab), iCol)
132b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
132c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
132d0 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c   op, iTabCur, x,
132e0 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20   regOut);.  }.  
132f0 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
13300 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
13310 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
13320 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
13330 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
13340 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
13350 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
13360 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
13370 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
13380 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20   pTab and store 
13390 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
133a0 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20   in a register. 
133b0 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73   An effort.** is
133c0 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74   made to store t
133d0 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
133e0 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
133f0 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a  , but this is.**
13400 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e   not guaranteed.
13410 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f    The location o
13420 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  f the column val
13430 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ue is returned..
13440 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
13450 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   be an open curs
13460 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54  or to pTab in iT
13470 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  able when this r
13480 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
13490 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e  led.  If iColumn
134a0 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20  <0 then code is 
134b0 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65  generated that e
134c0 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69  xtracts the rowi
134d0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
134e0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
134f0 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
13500 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
13510 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
13520 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
13530 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
13540 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
13550 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  on of the table 
13560 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66  we are reading f
13570 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  rom */.  int iCo
13580 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64  lumn,     /* Ind
13590 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
135a0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
135b0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  iTable,      /* 
135c0 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  The cursor point
135d0 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ing to the table
135e0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20   */.  int iReg, 
135f0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
13600 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
13610 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20    u8 p5         
13620 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66     /* P5 value f
13630 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a  or OP_Column */.
13640 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
13650 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
13660 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
13670 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
13680 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
13690 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
136a0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
136b0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
136c0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30     if( p->iReg>0
136d0 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
136e0 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
136f0 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
13700 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
13710 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
13720 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
13730 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
13740 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d  ister(pParse, p-
13750 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65  >iReg);.      re
13760 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
13770 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
13780 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
13790 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
137a0 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
137b0 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
137c0 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
137d0 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73   if( p5 ){.    s
137e0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
137f0 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c  P5(v, p5);.  }el
13800 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74  se{   .    sqlit
13810 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
13820 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c  (pParse, iTable,
13830 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
13840 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
13850 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  eg;.}../*.** Cle
13860 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61  ar all column ca
13870 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  che entries..*/.
13880 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
13890 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65  CacheClear(Parse
138a0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
138b0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
138c0 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20  lCache *p;..#if 
138d0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
138e0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
138f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
13900 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
13910 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41      printf("CLEA
13920 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  R\n");.  }.#endi
13930 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  f.  for(i=0, p=p
13940 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
13950 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
13960 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
13970 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
13980 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  g ){.      cache
13990 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
139a0 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e, p);.      p->
139b0 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  iReg = 0;.    }.
139c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
139d0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
139e0 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  t an affinity ch
139f0 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65  ange has occurre
13a00 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72  d on iCount.** r
13a10 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
13a20 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a  g with iStart..*
13a30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
13a40 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
13a50 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  hange(Parse *pPa
13a60 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c  rse, int iStart,
13a70 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20   int iCount){.  
13a80 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
13a90 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
13aa0 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a  Start, iCount);.
13ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
13ac0 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63  e code to move c
13ad0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69  ontent from regi
13ae0 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46  sters iFrom...iF
13af0 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76  rom+nReg-1.** ov
13b00 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e  er to iTo..iTo+n
13b10 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20  Reg-1. Keep the 
13b20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d  column cache up-
13b30 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  to-date..*/.void
13b40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13b50 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  Move(Parse *pPar
13b60 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
13b70 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67  nt iTo, int nReg
13b80 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
13b90 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
13ba0 70 3b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72  p;.  assert( iFr
13bb0 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20  om>=iTo+nReg || 
13bc0 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20  iFrom+nReg<=iTo 
13bd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13be0 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70  AddOp3(pParse->p
13bf0 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69  Vdbe, OP_Move, i
13c00 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29  From, iTo, nReg)
13c10 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
13c20 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
13c30 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
13c40 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
13c50 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 2d  {.    int x = p-
13c60 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 78  >iReg;.    if( x
13c70 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69 46 72  >=iFrom && x<iFr
13c80 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 20  om+nReg ){.     
13c90 20 70 2d 3e 69 52 65 67 20 2b 3d 20 69 54 6f 2d   p->iReg += iTo-
13ca0 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  iFrom;.    }.  }
13cb0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
13cc0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
13cd0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
13ce0 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f  COVERAGE_TEST)./
13cf0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
13d00 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72   if any register
13d10 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46   in the range iF
13d20 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73  rom..iTo (inclus
13d30 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20  ive).** is used 
13d40 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  as part of the c
13d50 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  olumn cache..**.
13d60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13d70 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  is used within a
13d80 73 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74  ssert() and test
13d90 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e  case() macros on
13da0 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e  ly.** and does n
13db0 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e  ot appear in a n
13dc0 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a  ormal build..*/.
13dd0 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41  static int usedA
13de0 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72  sColumnCache(Par
13df0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
13e00 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
13e10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
13e20 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
13e30 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
13e40 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
13e50 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
13e60 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
13e70 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e  .    int r = p->
13e80 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e  iReg;.    if( r>
13e90 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f  =iFrom && r<=iTo
13ea0 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20   ) return 1;    
13eb0 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a  /*NO_TEST*/.  }.
13ec0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
13ed0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
13ee0 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43  EBUG || SQLITE_C
13ef0 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a  OVERAGE_TEST */.
13f00 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
13f10 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  n expression nod
13f20 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  e to a TK_REGIST
13f30 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ER.*/.static voi
13f40 64 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72  d exprToRegister
13f50 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52  (Expr *p, int iR
13f60 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20  eg){.  p->op2 = 
13f70 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d  p->op;.  p->op =
13f80 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
13f90 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67  p->iTable = iReg
13fa0 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f  ;.  ExprClearPro
13fb0 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70  perty(p, EP_Skip
13fc0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
13fd0 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
13fe0 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
13ff0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
14000 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
14010 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  ion.  Attempt to
14020 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
14030 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22  ts in register "
14040 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75  target"..** Retu
14050 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
14060 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72  where results ar
14070 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
14080 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  With this routin
14090 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67  e, there is no g
140a0 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65  uarantee that re
140b0 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
140c0 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
140d0 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
140e0 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
140f0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
14100 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
14110 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
14120 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
14130 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
14140 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
14150 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
14160 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
14170 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
14180 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
14190 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
141a0 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
141b0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
141c0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
141d0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
141e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
141f0 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
14200 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
14210 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
14220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14230 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
14240 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
14250 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
14260 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
14270 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
14280 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
14290 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
142a0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
142b0 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
142c0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
142d0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
142e0 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
142f0 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
14300 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
14310 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
14320 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
14330 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56  , r4;       /* V
14340 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
14350 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c  numbers */.  sql
14360 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
14370 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
14380 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
14390 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70  n */.  Expr temp
143a0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
143b0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78   /* Temporary ex
143c0 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f  pression node */
143d0 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
143e0 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
143f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
14400 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
14410 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
14420 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
14430 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
14440 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   0;.  }..  if( p
14450 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  Expr==0 ){.    o
14460 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d  p = TK_NULL;.  }
14470 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70  else{.    op = p
14480 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20  Expr->op;.  }.  
14490 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
144a0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
144b0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  LUMN: {.      Ag
144c0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
144d0 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
144e0 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
144f0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
14500 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
14510 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  Col[pExpr->iAgg]
14520 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
14530 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
14540 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
14550 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e  ert( pCol->iMem>
14560 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
14570 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b  eg = pCol->iMem;
14580 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
14590 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
145a0 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
145b0 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
145c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
145d0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
145e0 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72  n, pAggInfo->sor
145f0 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20  tingIdxPTab,.   
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14610 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
14620 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
14630 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
14640 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
14650 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69        /* Otherwi
14660 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e  se, fall thru in
14670 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e  to the TK_COLUMN
14680 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
14690 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
146a0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  N: {.      int i
146b0 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Tab = pExpr->iTa
146c0 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ble;.      if( i
146d0 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Tab<0 ){.       
146e0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42   if( pParse->ckB
146f0 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ase>0 ){.       
14700 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67     /* Generating
14710 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
14720 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  ts or inserting 
14730 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64  into partial ind
14740 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ex */.          
14750 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69  inReg = pExpr->i
14760 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d  Column + pParse-
14770 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20  >ckBase;.       
14780 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
147a0 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 66     /* Deleting f
147b0 72 6f 6d 20 61 20 70 61 72 74 69 61 6c 20 69 6e  rom a partial in
147c0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  dex */.         
147d0 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
147e0 69 50 61 72 74 49 64 78 54 61 62 3b 0a 20 20 20  iPartIdxTab;.   
147f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14800 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
14810 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
14820 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45  olumn(pParse, pE
14830 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20  xpr->pTab,.     
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14850 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
14860 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  >iColumn, iTab, 
14870 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14890 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
148a0 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
148b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
148c0 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
148d0 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
148e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
148f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14900 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
14910 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14920 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
14930 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
14940 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
14950 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
14960 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
14970 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
14980 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45    codeReal(v, pE
14990 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
149a0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
149b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
149c0 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
149d0 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
149e0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
149f0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
14a00 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
14a10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14a20 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
14a30 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65  tring8, 0, targe
14a40 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  t, 0, pExpr->u.z
14a50 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20  Token, 0);.     
14a60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14a70 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
14a80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
14a90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14aa0 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
14ab0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14ac0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
14ad0 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
14ae0 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
14af0 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
14b00 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  int n;.      con
14b10 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
14b20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20    char *zBlob;. 
14b30 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
14b40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
14b50 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
14b60 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
14b70 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
14b80 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45  en[0]=='x' || pE
14b90 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
14ba0 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61  =='X' );.      a
14bb0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
14bc0 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20  zToken[1]=='\'' 
14bd0 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45  );.      z = &pE
14be0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d  xpr->u.zToken[2]
14bf0 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69  ;.      n = sqli
14c00 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d  te3Strlen30(z) -
14c10 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
14c20 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ( z[n]=='\'' );.
14c30 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71        zBlob = sq
14c40 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73  lite3HexToBlob(s
14c50 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c  qlite3VdbeDb(v),
14c60 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71   z, n);.      sq
14c70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
14c80 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c  v, OP_Blob, n/2,
14c90 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f   target, 0, zBlo
14ca0 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  b, P4_DYNAMIC);.
14cb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14cc0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
14cd0 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
14ce0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14cf0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
14d00 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
14d10 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
14d20 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
14d30 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20  Token!=0 );.    
14d40 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
14d50 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20  >u.zToken[0]!=0 
14d60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14d70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14d80 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
14d90 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
14da0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  t);.      if( pE
14db0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
14dc0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
14dd0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
14de0 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a  zToken[0]=='?' .
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
14e00 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e  strcmp(pExpr->u.
14e10 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e  zToken, pParse->
14e20 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f  azVar[pExpr->iCo
14e30 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20  lumn-1])==0 );. 
14e40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14e50 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
14e60 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  , pParse->azVar[
14e70 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31  pExpr->iColumn-1
14e80 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ], P4_STATIC);. 
14e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14ea0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14eb0 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
14ec0 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  {.      inReg = 
14ed0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
14ee0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14ef0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53  }.    case TK_AS
14f00 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  : {.      inReg 
14f10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14f20 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
14f30 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
14f40 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
14f50 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
14f60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
14f70 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ST.    case TK_C
14f80 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  AST: {.      /* 
14f90 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
14fa0 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28  he form:   CAST(
14fb0 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20  pLeft AS token) 
14fc0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  */.      int aff
14fd0 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69  , to_op;.      i
14fe0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
14ff0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
15000 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15010 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
15020 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
15030 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
15040 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
15050 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71  ;.      aff = sq
15060 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
15070 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e(pExpr->u.zToke
15080 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 74 6f 5f  n, 0);.      to_
15090 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54  op = aff - SQLIT
150a0 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f  E_AFF_TEXT + OP_
150b0 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73  ToText;.      as
150c0 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
150d0 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66  ToText    || aff
150e0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  !=SQLITE_AFF_TEX
150f0 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73  T    );.      as
15100 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
15110 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66  ToBlob    || aff
15120 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  !=SQLITE_AFF_NON
15130 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73  E    );.      as
15140 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
15150 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66  ToNumeric || aff
15160 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  !=SQLITE_AFF_NUM
15170 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73  ERIC );.      as
15180 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
15190 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66  ToInt     || aff
151a0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  !=SQLITE_AFF_INT
151b0 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73  EGER );.      as
151c0 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
151d0 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66  ToReal    || aff
151e0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  !=SQLITE_AFF_REA
151f0 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65  L    );.      te
15200 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
15210 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20  P_ToText );.    
15220 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
15230 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a  p==OP_ToBlob );.
15240 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15250 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65  to_op==OP_ToNume
15260 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ric );.      tes
15270 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
15280 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20  _ToInt );.      
15290 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
152a0 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20  =OP_ToReal );.  
152b0 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
152c0 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20  arget ){.       
152d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
152e0 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
152f0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
15300 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
15310 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a  target;.      }.
15320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15330 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70  eAddOp1(v, to_op
15340 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
15350 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73  testcase( usedAs
15360 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
15370 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67  se, inReg, inReg
15380 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
15390 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
153a0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
153b0 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20  , inReg, 1);.   
153c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
153d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
153e0 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20  _OMIT_CAST */.  
153f0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
15400 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
15410 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
15420 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
15430 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
15440 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
15450 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
15460 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
15470 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
15480 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
15490 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
154a0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
154b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
154c0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
154d0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
154e0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
154f0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
15500 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
15530 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
15540 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
15550 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
15560 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
15570 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
15580 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
15590 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
155a0 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
155b0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
155c0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
155d0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
155e0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
155f0 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
15600 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
15610 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
15620 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
15630 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
15640 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
15650 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
15660 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
15670 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
15680 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
15690 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
156a0 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
156b0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
156c0 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Eq);.      asse
156d0 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
156e0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
156f0 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
15700 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
15710 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
15720 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
15730 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15740 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
15750 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15760 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
15770 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
15780 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
15790 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
157a0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
157b0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
157c0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
157d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
157e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
157f0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
15800 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
15810 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15820 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
15830 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
15840 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
15850 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
15860 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
15870 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
15880 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
15890 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
158a0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
158c0 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
158d0 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53  LITE_STOREP2 | S
158e0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
158f0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
15900 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51  eIf(v, op==TK_EQ
15910 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
15920 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
15930 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73  K_NE);.      tes
15940 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
15950 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
15960 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
15970 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
15980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15990 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
159a0 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
159b0 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
159c0 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
159d0 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
159e0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
159f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
15a00 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
15a10 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
15a20 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
15a30 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
15a40 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
15a50 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
15a60 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
15a70 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
15a80 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20  OP_And );       
15a90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15aa0 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
15ab0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
15ac0 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20  ==OP_Or );      
15ad0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
15ae0 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
15af0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15b00 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20  PLUS==OP_Add ); 
15b10 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
15b20 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
15b30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15b40 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75   TK_MINUS==OP_Su
15b50 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74 65  btract );     te
15b60 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d  stcase( op==TK_M
15b70 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73  INUS );.      as
15b80 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
15b90 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20  _Remainder );   
15ba0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15bb0 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20  =TK_REM );.     
15bc0 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
15bd0 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
15be0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15bf0 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b  op==TK_BITAND );
15c00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
15c10 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
15c20 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73 74  r );        test
15c30 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
15c40 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
15c50 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
15c60 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20 20  _Divide );      
15c70 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15c80 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20  K_SLASH );.     
15c90 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
15ca0 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
15cb0 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
15cc0 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b  op==TK_LSHIFT );
15cd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
15ce0 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
15cf0 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73 74  ftRight );  test
15d00 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
15d10 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
15d20 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
15d30 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20  OP_Concat );    
15d40 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15d50 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20  TK_CONCAT );.   
15d60 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
15d70 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15d80 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15d90 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
15da0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
15db0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15dc0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
15dd0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
15de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15df0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
15e00 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
15e10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15e20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
15e30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
15e40 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
15e50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15e60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
15e70 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
15e80 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
15e90 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
15ea0 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
15eb0 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
15ec0 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
15ed0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49  ){.        codeI
15ee0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
15ef0 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29  Left, 1, target)
15f00 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
15f10 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
15f20 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65  OINT.      }else
15f30 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
15f40 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
15f50 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
15f60 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
15f70 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
15f80 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
15f90 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75  Real(v, pLeft->u
15fa0 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67  .zToken, 1, targ
15fb0 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  et);.#endif.    
15fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15fd0 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49   tempX.op = TK_I
15fe0 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20  NTEGER;.        
15ff0 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50  tempX.flags = EP
16000 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b  _IntValue|EP_Tok
16010 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20  enOnly;.        
16020 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d  tempX.u.iValue =
16030 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d   0;.        r1 =
16040 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16050 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65  Temp(pParse, &te
16060 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b  mpX, &regFree1);
16070 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
16080 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
16090 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
160a0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
160b0 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
160c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
160d0 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32   OP_Subtract, r2
160e0 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
160f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
16100 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
16110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
16120 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
16130 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16140 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
16150 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
16160 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
16170 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
16180 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20  =OP_BitNot );   
16190 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
161a0 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20  _BITNOT );.     
161b0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d   assert( TK_NOT=
161c0 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20  =OP_Not );      
161d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
161e0 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_NOT );.     
161f0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
16200 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
16210 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
16220 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
16230 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
16240 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
16250 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
16260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16270 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
16280 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  r1, inReg);.    
16290 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
162a0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
162b0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
162c0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
162d0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
162e0 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
162f0 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20  L==OP_IsNull ); 
16300 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16310 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
16320 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
16330 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
16340 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f  l ); testcase( o
16350 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
16360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16370 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16380 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
16390 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  t);.      r1 = s
163a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
163b0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
163c0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
163d0 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
163e0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
163f0 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
16400 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16410 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20  p1(v, op, r1);. 
16420 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
16430 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
16440 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
16450 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
16460 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
16470 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16480 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
16490 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31  dImm, target, -1
164a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
164b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
164c0 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65  addr);.      bre
164d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
164e0 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
164f0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  ON: {.      AggI
16500 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78  nfo *pInfo = pEx
16510 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
16520 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30      if( pInfo==0
16530 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
16540 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
16550 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
16560 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
16570 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16580 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
16590 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
165a0 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e  : %s()", pExpr->
165b0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
165c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
165d0 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61  inReg = pInfo->a
165e0 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67  Func[pExpr->iAgg
165f0 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ].iMem;.      }.
16600 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16610 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
16620 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
16630 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67   ExprList *pFarg
16640 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
16650 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
16660 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
16670 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20  nt nFarg;       
16680 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16690 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
166a0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46  ments */.      F
166b0 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
166c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
166d0 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
166e0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20   object */.     
166f0 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20   int nId;       
16700 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
16710 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  h of the functio
16720 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  n name in bytes 
16730 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
16740 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
16750 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
16760 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33  name */.      u3
16770 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  2 constMask = 0;
16780 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
16790 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
167a0 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
167b0 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
167c0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
167d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
167e0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38  nter */.      u8
167f0 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20   enc = ENC(db); 
16800 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
16810 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62   encoding used b
16820 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
16830 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
16840 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20   *pColl = 0;    
16850 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73  /* A collating s
16860 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20  equence */..    
16870 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
16880 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16890 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
168a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
168b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
168c0 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
168d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61  ) ){.        pFa
168e0 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rg = 0;.      }e
168f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61  lse{.        pFa
16900 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  rg = pExpr->x.pL
16910 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
16920 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67     nFarg = pFarg
16930 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20   ? pFarg->nExpr 
16940 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  : 0;.      asser
16950 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
16960 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
16970 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
16980 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e   zId = pExpr->u.
16990 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49  zToken;.      nI
169a0 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  d = sqlite3Strle
169b0 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20  n30(zId);.      
169c0 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
169d0 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
169e0 49 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20  Id, nId, nFarg, 
169f0 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
16a00 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
16a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
16a20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
16a30 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a  nknown function:
16a40 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a   %.*s()", nId, z
16a50 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Id);.        bre
16a60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
16a70 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20     /* Attempt a 
16a80 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74  direct implement
16a90 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
16aa0 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29  lt-in COALESCE()
16ab0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46   and.      ** IF
16ac0 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73  NULL() functions
16ad0 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75  .  This avoids u
16ae0 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 61  nnecessary evala
16af0 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tion of.      **
16b00 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20   arguments past 
16b10 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55  the first non-NU
16b20 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  LL argument..   
16b30 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
16b40 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
16b50 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  & SQLITE_FUNC_CO
16b60 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20  ALESCE ){.      
16b70 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63    int endCoalesc
16b80 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
16b90 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
16ba0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
16bb0 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  rg>=2 );.       
16bc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16bd0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
16be0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
16bf0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  et);.        for
16c00 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=1; i<nFarg; i
16c10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
16c20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16c30 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
16c40 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65  target, endCoale
16c50 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sce);.          
16c60 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16c70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16c80 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
16c90 65 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74  e(pParse, target
16ca0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
16cb0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16cc0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
16cd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
16ce0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
16cf0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
16d00 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
16d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16d20 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
16d30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16d40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16d50 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
16d60 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20  endCoalesce);.  
16d70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16d80 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
16d90 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75  he UNLIKELY() fu
16da0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
16db0 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69  p.  The result i
16dc0 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  s the value.    
16dd0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
16de0 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  t argument..    
16df0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
16e00 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
16e10 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c   SQLITE_FUNC_UNL
16e20 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  IKELY ){.       
16e30 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
16e40 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 );.        sql
16e50 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
16e60 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
16e70 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
16e80 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
16e90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
16ea0 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b  or(i=0; i<nFarg;
16eb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
16ec0 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74  f( i<32 && sqlit
16ed0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
16ee0 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78  (pFarg->a[i].pEx
16ef0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
16f00 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31   testcase( i==31
16f10 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
16f20 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42  nstMask |= MASKB
16f30 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20  IT32(i);.       
16f40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
16f50 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
16f60 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
16f70 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70  EDCOLL)!=0 && !p
16f80 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
16f90 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
16fa0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
16fb0 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
16fc0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
16fd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
16fe0 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20   if( pFarg ){.  
16ff0 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d        if( constM
17000 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ask ){.         
17010 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d   r1 = pParse->nM
17020 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  em+1;.          
17030 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
17040 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d  nFarg;.        }
17050 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17060 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
17070 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
17080 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20   nFarg);.       
17090 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
170a0 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20  or length() and 
170b0 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f  typeof() functio
170c0 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e  ns with a column
170d0 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20   argument,.     
170e0 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35     ** set the P5
170f0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
17100 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  e OP_Column opco
17110 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e  de to OPFLAG_LEN
17120 47 54 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a  GTHARG.        *
17130 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45  * or OPFLAG_TYPE
17140 4f 46 41 52 47 20 72 65 73 70 65 63 74 69 76 65  OFARG respective
17150 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ly, to avoid unn
17160 65 63 65 73 73 61 72 79 20 64 61 74 61 0a 20 20  ecessary data.  
17170 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67        ** loading
17180 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
17190 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
171a0 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c  funcFlags & (SQL
171b0 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c  ITE_FUNC_LENGTH|
171c0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
171d0 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  OF))!=0 ){.     
171e0 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a       u8 exprOp;.
171f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17200 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
17210 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17220 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
17230 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
17240 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67    exprOp = pFarg
17250 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
17260 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17270 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  exprOp==TK_COLUM
17280 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f  N || exprOp==TK_
17290 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
172a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
172b0 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45  ( SQLITE_FUNC_LE
172c0 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e  NGTH==OPFLAG_LEN
172d0 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
172e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
172f0 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
17300 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  ==OPFLAG_TYPEOFA
17310 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
17320 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 66    testcase( pDef
17330 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50  ->funcFlags & OP
17340 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
17350 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ;.            pF
17360 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
17370 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20  >op2 = .        
17380 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e            pDef->
17390 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46  funcFlags & (OPF
173a0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50  LAG_LENGTHARG|OP
173b0 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b  FLAG_TYPEOFARG);
173c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
173d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
173e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
173f0 50 75 73 68 28 70 50 61 72 73 65 29 3b 20 20 20  Push(pParse);   
17400 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32    /* Ticket 2ea2
17410 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20  425d34be */.    
17420 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17430 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
17440 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 0a 20  se, pFarg, r1,. 
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17470 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53  QLITE_ECEL_DUP|S
17480 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
17490 52 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  R);.        sqli
174a0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
174b0 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a  pParse);      /*
174c0 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
174d0 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65  34be */.      }e
174e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
174f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
17500 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17510 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
17520 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
17530 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
17540 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
17550 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
17560 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
17570 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
17580 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17590 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
175a0 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
175b0 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
175c0 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
175d0 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
175e0 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
175f0 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
17600 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
17610 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
17620 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
17630 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
17640 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
17650 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
17660 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
17670 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
17680 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
17690 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
176a0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
176b0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
176c0 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
176d0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
176e0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
176f0 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
17700 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
17710 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
17720 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
17730 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
17740 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
17750 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
17760 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
17770 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
17780 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
17790 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
177a0 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
177b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
177c0 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70  ( nFarg>=2 && (p
177d0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
177e0 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
177f0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
17800 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
17810 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
17820 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
17830 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
17840 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
17850 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  Farg>0 ){.      
17860 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
17870 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
17880 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
17890 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30  Farg, pFarg->a[0
178a0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
178b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
178c0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
178d0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
178e0 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
178f0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
17900 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
17910 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
17920 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17930 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
17940 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
17950 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
17960 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
17970 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17980 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75  eAddOp4(v, OP_Fu
17990 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73  nction, constMas
179a0 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20  k, r1, target,. 
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 44         (char*)pD
179d0 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
179e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
179f0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
17a00 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  8)nFarg);.      
17a10 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e  if( nFarg && con
17a20 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20  stMask==0 ){.   
17a30 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
17a40 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
17a50 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
17a60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
17a70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
17a80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17a90 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
17aa0 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
17ab0 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
17ac0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
17ad0 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  e( op==TK_EXISTS
17ae0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17af0 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  se( op==TK_SELEC
17b00 54 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  T );.      inReg
17b10 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
17b20 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
17b30 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pExpr, 0, 0);.  
17b40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17b50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
17b60 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
17b70 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
17b80 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17b90 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
17ba0 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
17bb0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17bc0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
17bd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17be0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
17bf0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
17c00 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
17c10 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
17c20 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
17c30 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
17c40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17c50 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
17c60 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
17c70 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17c80 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
17c90 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alse);.      sql
17ca0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17cb0 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
17cc0 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  get, 0);.      s
17cd0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
17ce0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
17cf0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
17d00 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
17d10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
17d20 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20  SUBQUERY */...  
17d30 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    /*.    **    x
17d40 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
17d50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17d60 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
17d70 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t to.    **.    
17d80 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
17d90 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <=z.    **.    *
17da0 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * X is stored in
17db0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
17dc0 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65     ** Y is store
17dd0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
17de0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20  t->a[0].pExpr.. 
17df0 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65     ** Z is store
17e00 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
17e10 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20  t->a[1].pExpr.. 
17e20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
17e30 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
17e40 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
17e50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
17e60 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
17e70 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65  List_item *pLIte
17e80 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  m = pExpr->x.pLi
17e90 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70  st->a;.      Exp
17ea0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74  r *pRight = pLIt
17eb0 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20  em->pExpr;..    
17ec0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
17ed0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17ee0 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72  e, pLeft, &regFr
17ef0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
17f00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17f10 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69  Temp(pParse, pRi
17f20 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
17f30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17f40 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
17f50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17f60 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
17f70 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
17f80 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
17f90 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20  se);.      r4 = 
17fa0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17fb0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
17fc0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
17fd0 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
17fe0 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20  ht, OP_Ge,.     
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
18000 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f   r2, r3, SQLITE_
18010 53 54 4f 52 45 50 32 29 3b 20 20 56 64 62 65 43  STOREP2);  VdbeC
18020 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
18030 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20    pLItem++;.    
18040 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65    pRight = pLIte
18050 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
18060 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18070 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
18080 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72  gFree2);.      r
18090 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
180a0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
180b0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
180c0 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
180d0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
180e0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
180f0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
18100 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c  ft, pRight, OP_L
18110 65 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53  e, r1, r2, r4, S
18120 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
18130 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
18140 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
18150 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18160 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34  , OP_And, r3, r4
18170 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
18180 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
18190 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
181a0 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
181b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
181c0 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20  pParse, r4);.   
181d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
181e0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
181f0 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
18200 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
18210 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
18220 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
18230 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
18240 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
18250 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18260 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  ..    case TK_TR
18270 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f  IGGER: {.      /
18280 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20  * If the opcode 
18290 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74  is TK_TRIGGER, t
182a0 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
182b0 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  on is a referenc
182c0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20  e.      ** to a 
182d0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
182e0 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65  w.* or old.* pse
182f0 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c  udo-tables avail
18300 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
18310 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
18320 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
18330 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73  Expr.iTable is s
18340 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a  et to 1 for the.
18350 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70        ** new.* p
18360 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20  seudo-table, or 
18370 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20  0 for the old.* 
18380 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78  pseudo-table. Ex
18390 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  pr.iColumn.     
183a0 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68   ** is set to th
183b0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
183c0 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20  pseudo-table to 
183d0 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74  read, or to -1 t
183e0 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  o.      ** read 
183f0 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e  the rowid field.
18400 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
18410 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
18420 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
18430 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72   using an OP_Par
18440 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70  am opcode. The p
18450 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d  1.      ** param
18460 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30  eter is set to 0
18470 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69   for an old.rowi
18480 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20  d reference, or 
18490 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a  to (i+1).      *
184a0 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61  * to reference a
184b0 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66  nother column of
184c0 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
184d0 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a  o-table, where .
184e0 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68        ** i is th
184f0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
18500 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77  olumn. For a new
18510 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
18520 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a  , p1 is.      **
18530 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77   set to (n+1), w
18540 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75  here n is the nu
18550 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
18560 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74  in each pseudo-t
18570 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46  able..      ** F
18580 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  or a reference t
18590 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75  o any other colu
185a0 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
185b0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31  pseudo-table, p1
185c0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
185d0 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65   to (n+2+i), whe
185e0 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61  re n and i are a
185f0 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f  s defined previo
18600 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20  usly. For.      
18610 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
18620 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63  he table on whic
18630 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62  h triggers are b
18640 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20  eing fired is.  
18650 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20      ** declared 
18660 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  as:.      **.   
18670 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
18680 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
18690 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
186a0 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65   Then p1 is inte
186b0 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f  rpreted as follo
186c0 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
186d0 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20     **   p1==0   
186e0 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20  ->    old.rowid 
186f0 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20      p1==3   ->  
18700 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20    new.rowid.    
18710 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d    **   p1==1   -
18720 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20  >    old.a      
18730 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20     p1==4   ->   
18740 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20   new.a.      ** 
18750 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20    p1==2   ->    
18760 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31  old.b         p1
18770 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==5   ->    new.
18780 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a  b       .      *
18790 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
187a0 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
187b0 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20  b;.      int p1 
187c0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
187d0 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  * (pTab->nCol+1)
187e0 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43   + 1 + pExpr->iC
187f0 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73  olumn;..      as
18800 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
18810 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
18820 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  >iTable==1 );.  
18830 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
18840 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26  r->iColumn>=-1 &
18850 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
18860 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
18870 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
18880 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45  b->iPKey<0 || pE
18890 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54  xpr->iColumn!=pT
188a0 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20  ab->iPKey );.   
188b0 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30     assert( p1>=0
188c0 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43   && p1<(pTab->nC
188d0 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20  ol*2+2) );..    
188e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
188f0 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c  Op2(v, OP_Param,
18900 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   p1, target);.  
18910 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
18920 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25  (v, "%s.%s -> $%
18930 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  d",.        (pEx
18940 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65  pr->iTable ? "ne
18950 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20  w" : "old"),.   
18960 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f       (pExpr->iCo
18970 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22  lumn<0 ? "rowid"
18980 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e   : pExpr->pTab->
18990 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
189a0 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20  umn].zName),.   
189b0 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20 20       target.    
189c0 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53    ));..#ifndef S
189d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
189e0 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
189f0 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
18a00 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69   has REAL affini
18a10 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65  ty, it may curre
18a20 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61  ntly be stored a
18a30 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  s an.      ** in
18a40 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65  teger. Use OP_Re
18a50 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61  alAffinity to ma
18a60 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72 65  ke sure it is re
18a70 61 6c 6c 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20  ally real.  */. 
18a80 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
18a90 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20  iColumn>=0 .    
18aa0 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c     && pTab->aCol
18ab0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
18ac0 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
18ad0 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
18ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18af0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
18b00 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
18b10 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
18b20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
18b30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
18b40 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     /*.    ** For
18b50 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m A:.    **   CA
18b60 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45  SE x WHEN e1 THE
18b70 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
18b80 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
18b90 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
18ba0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
18bb0 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a  * Form B:.    **
18bc0 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20     CASE WHEN e1 
18bd0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
18be0 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
18bf0 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
18c00 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
18c10 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63    ** Form A is c
18c20 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65  an be transforme
18c30 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76  d into the equiv
18c40 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20  alent form B as 
18c50 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20  follows:.    ** 
18c60 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31    CASE WHEN x=e1
18c70 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d   THEN r1 WHEN x=
18c80 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20  e2 THEN r2 .... 
18c90 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45     **        WHE
18ca0 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45  N x=eN THEN rN E
18cb0 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
18cc0 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74  .    ** X (if it
18cd0 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70   exists) is in p
18ce0 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
18cf0 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20   ** Y is in the 
18d00 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  last element of 
18d10 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69  pExpr->x.pList i
18d20 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  f pExpr->x.pList
18d30 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a  ->nExpr is.    *
18d40 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73  * odd.  The Y is
18d50 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20   also optional. 
18d60 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
18d70 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e  f elements in x.
18d80 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20  pList.    ** is 
18d90 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20  even, then Y is 
18da0 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68 65 20  omitted and the 
18db0 22 6f 74 68 65 72 77 69 73 65 22 20 72 65 73 75  "otherwise" resu
18dc0 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20  lt is NULL..    
18dd0 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78 70  ** Ei is in pExp
18de0 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d  r->pList->a[i*2]
18df0 20 61 6e 64 20 52 69 20 69 73 20 70 45 78 70 72   and Ri is pExpr
18e00 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31  ->pList->a[i*2+1
18e10 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ]..    **.    **
18e20 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
18e30 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
18e40 20 74 68 65 20 52 69 20 66 6f 72 20 74 68 65 20   the Ri for the 
18e50 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45  first matching E
18e60 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20  i,.    ** or if 
18e70 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
18e80 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53  hing Ei, the ELS
18e90 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20  E term Y, or if 
18ea0 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20  there is.    ** 
18eb0 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55  no ELSE term, NU
18ec0 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LL..    */.    d
18ed0 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
18ee0 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b  op==TK_CASE ); {
18ef0 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61  .      int endLa
18f00 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  bel;            
18f10 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
18f20 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f   label for end o
18f30 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20  f CASE stmt */. 
18f40 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73       int nextCas
18f50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
18f60 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
18f70 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48  abel for next WH
18f80 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  EN clause */.   
18f90 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20     int nExpr;   
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fb0 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65       /* 2x numbe
18fc0 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  r of WHEN terms 
18fd0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
19000 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
19010 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
19020 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
19030 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
19040 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
19050 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
19060 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74  List_item *aList
19070 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20  elem;  /* Array 
19080 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
19090 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f  .      Expr opCo
190a0 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20  mpare;          
190b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
190c0 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e  X==Ei expression
190d0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
190e0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
190f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19100 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20  he X expression 
19110 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
19120 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Test = 0;       
19130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d             /* X=
19140 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20  =Ei (form A) or 
19150 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29  just Ei (form B)
19160 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e   */.      VVA_ON
19170 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65  LY( int iCacheLe
19180 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
19190 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20  acheLevel; )..  
191a0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
191b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
191c0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
191d0 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ) && pExpr->x.pL
191e0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ist );.      ass
191f0 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ert(pExpr->x.pLi
19200 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
19210 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
19220 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
19230 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d       aListelem =
19240 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
19250 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74    nExpr = pEList
19260 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
19270 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  ndLabel = sqlite
19280 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
19290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  );.      if( (pX
192a0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29   = pExpr->pLeft)
192b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74  !=0 ){.        t
192c0 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20  empX = *pX;.    
192d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
192e0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
192f0 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 54  );.        exprT
19300 6f 52 65 67 69 73 74 65 72 28 26 74 65 6d 70 58  oRegister(&tempX
19310 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
19320 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58  eTemp(pParse, pX
19330 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
19340 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19350 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
19360 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
19370 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20  e.op = TK_EQ;.  
19380 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
19390 70 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a  pLeft = &tempX;.
193a0 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
193b0 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20  &opCompare;.    
193c0 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33      /* Ticket b3
193d0 35 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39  51d95f9cd5ef17e9
193e0 64 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31  d9dbae18f5ca8611
193f0 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20  190001:.        
19400 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
19410 72 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67  regFree1 might g
19420 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f  et SCopy-ed into
19430 20 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74   the file result
19440 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20  ..        ** So 
19450 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
19460 68 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69  he regFree1 regi
19470 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73  ster is not reus
19480 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20  ed for other.   
19490 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73       ** purposes
194a0 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76   and possibly ov
194b0 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20  erwritten.  */. 
194c0 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20         regFree1 
194d0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
194e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
194f0 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20  xpr-1; i=i+2){. 
19500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
19510 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
19520 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
19530 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
19540 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d   assert( pTest!=
19550 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 );.          o
19560 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20  pCompare.pRight 
19570 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
19580 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
19590 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
195a0 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  Test = aListelem
195b0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
195c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78     }.        nex
195d0 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56  tCase = sqlite3V
195e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
195f0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19600 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b  e( pTest->op==TK
19610 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
19620 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
19630 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
19640 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53  est, nextCase, S
19650 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
19660 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
19670 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ase( aListelem[i
19680 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  +1].pExpr->op==T
19690 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
196a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
196b0 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73  ode(pParse, aLis
196c0 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
196d0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
196e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
196f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
19700 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20   0, endLabel);. 
19710 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
19720 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
19730 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
19740 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
19750 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29  bel(v, nextCase)
19760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19770 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30  if( (nExpr&1)!=0
19780 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19790 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
197a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
197b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
197c0 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
197d0 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78  ->a[nExpr-1].pEx
197e0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
197f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19800 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
19810 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19830 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
19840 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
19850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
19860 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
19870 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
19880 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20  e->nErr>0 .     
19890 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
198a0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43  >iCacheLevel==iC
198b0 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20  acheLevel );.   
198c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
198d0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
198e0 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62  dLabel);.      b
198f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
19900 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19910 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65  TRIGGER.    case
19920 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
19930 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
19940 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52  ->affinity==OE_R
19950 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20  ollback .       
19960 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
19970 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
19980 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
19990 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
199a0 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20  OE_Fail.        
199b0 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
199c0 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
199d0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
199e0 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72  if( !pParse->pTr
199f0 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20  iggerTab ){.    
19a00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19a10 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a30 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
19a40 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
19a50 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
19a60 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
19a70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
19a80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
19a90 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
19aa0 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
19ab0 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
19ac0 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
19ad0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
19ae0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
19af0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
19b00 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69  alue) );.      i
19b10 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
19b20 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b  ty==OE_Ignore ){
19b30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19b40 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
19b50 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61          v, OP_Ha
19b60 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f  lt, SQLITE_OK, O
19b70 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78  E_Ignore, 0, pEx
19b80 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b  pr->u.zToken,0);
19b90 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
19ba0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
19bb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
19bc0 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
19bd0 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c  aint(pParse, SQL
19be0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
19bf0 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20  RIGGER,.        
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c10 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
19c20 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e  inity, pExpr->u.
19c30 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20  zToken, 0, 0);. 
19c40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72       }..      br
19c50 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
19c60 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  f.  }.  sqlite3R
19c70 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19c80 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
19c90 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
19ca0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19cb0 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65   regFree2);.  re
19cc0 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f  turn inReg;.}../
19cd0 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20  *.** Factor out 
19ce0 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20  the code of the 
19cf0 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
19d00 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69   to initializati
19d10 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  on time..*/.void
19d20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19d30 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20  AtInit(.  Parse 
19d40 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
19d50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
19d60 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
19d70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
19d80 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20  ression to code 
19d90 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e  when the VDBE in
19da0 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69  itializes */.  i
19db0 6e 74 20 72 65 67 44 65 73 74 2c 20 20 20 20 20  nt regDest,     
19dc0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61   /* Store the va
19dd0 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
19de0 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 75  ster */.  u8 reu
19df0 73 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20 54  sable       /* T
19e00 72 75 65 20 69 66 20 74 68 69 73 20 65 78 70 72  rue if this expr
19e10 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61 62  ession is reusab
19e20 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  le */.){.  ExprL
19e30 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  ist *p;.  assert
19e40 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
19e50 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d  pParse) );.  p =
19e60 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
19e70 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 73  xpr;.  pExpr = s
19e80 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
19e90 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
19ea0 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   0);.  p = sqlit
19eb0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
19ec0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70  (pParse, p, pExp
19ed0 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  r);.  if( p ){. 
19ee0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
19ef0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
19f00 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  = &p->a[p->nExpr
19f10 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  -1];.     pItem-
19f20 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
19f30 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20 20   = regDest;.    
19f40 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
19f50 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20 7d   = reusable;.  }
19f60 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  .  pParse->pCons
19f70 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  tExpr = p;.}../*
19f80 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19f90 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  e to evaluate an
19fa0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
19fb0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
19fc0 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69  s.** into a regi
19fd0 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ster.  Return th
19fe0 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
19ff0 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75  r where the resu
1a000 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  lts.** are store
1a010 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
1a020 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
1a030 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1a040 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61   that can be dea
1a050 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65  llocated,.** the
1a060 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62  n write its numb
1a070 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20  er into *pReg.  
1a080 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
1a090 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a  gister is not.**
1a0a0 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68   a temporary, th
1a0b0 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20  en set *pReg to 
1a0c0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  zero..**.** If p
1a0d0 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61  Expr is a consta
1a0e0 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
1a0f0 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65  utine might gene
1a100 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64  rate this.** cod
1a110 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65  e to fill the re
1a120 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e  gister in the in
1a130 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63  itialization sec
1a140 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56  tion of the.** V
1a150 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20  DBE program, in 
1a160 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20  order to factor 
1a170 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76  it out of the ev
1a180 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a  aluation loop..*
1a190 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1a1a0 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20  rCodeTemp(Parse 
1a1b0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1a1c0 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29  Expr, int *pReg)
1a1d0 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45  {.  int r2;.  pE
1a1e0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1a1f0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78  rSkipCollate(pEx
1a200 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74  pr);.  if( Const
1a210 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
1a220 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  .   && pExpr->op
1a230 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20  !=TK_REGISTER.  
1a240 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
1a250 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
1a260 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20  (pExpr).  ){.   
1a270 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 70   ExprList *p = p
1a280 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1a290 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  r;.    int i;.  
1a2a0 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20    *pReg  = 0;.  
1a2b0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
1a2c0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1a2d0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1a2e0 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d      for(pItem=p-
1a2f0 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20  >a, i=p->nExpr; 
1a300 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d  i>0; pItem++, i-
1a310 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -){.        if( 
1a320 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
1a330 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
1a340 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
1a350 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20  pr,pExpr,-1)==0 
1a360 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1a370 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f  urn pItem->u.iCo
1a380 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20  nstExprReg;.    
1a390 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a3a0 20 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b 70    }.    r2 = ++p
1a3b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1a3c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a3d0 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
1a3e0 45 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20 20  Expr, r2, 1);.  
1a3f0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
1a400 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
1a410 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1a420 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1a430 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1a440 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
1a450 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31  ;.    if( r2==r1
1a460 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20   ){.      *pReg 
1a470 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = r1;.    }else{
1a480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1a490 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1a4a0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
1a4b0 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  *pReg = 0;.    }
1a4c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
1a4d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1a4e0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1a4f0 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
1a500 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
1a510 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
1a520 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
1a530 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
1a540 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
1a550 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
1a560 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
1a570 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  arget..*/.void s
1a580 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
1a590 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1a5a0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
1a5b0 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
1a5c0 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
1a5d0 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
1a5e0 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
1a5f0 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
1a600 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
1a610 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
1a620 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a630 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
1a640 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
1a650 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
1a660 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a670 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
1a680 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1a690 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1a6a0 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
1a6b0 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  ( pParse->pVdbe 
1a6c0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
1a6d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1a6e0 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
1a6f0 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e  rget && pParse->
1a700 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73  pVdbe ){.      s
1a710 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a720 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1a730 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
1a740 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a   target);.    }.
1a750 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
1a760 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1a770 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
1a780 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
1a790 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
1a7a0 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
1a7b0 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
1a7c0 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
1a7d0 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
1a7e0 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
1a7f0 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68 65   target.  If the
1a800 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
1a810 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
1a820 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
1a830 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f  ght choose to co
1a840 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  de the expressio
1a850 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  n at initializat
1a860 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
1a870 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1a880 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73  eFactorable(Pars
1a890 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1a8a0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1a8b0 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  et){.  if( pPars
1a8c0 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1a8d0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
1a8e0 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29  sConstant(pExpr)
1a8f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1a900 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
1a910 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1a920 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  get, 0);.  }else
1a930 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1a940 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1a950 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1a960 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1a970 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
1a980 61 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e  alutes the given
1a990 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
1a9a0 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a  puts the result.
1a9b0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
1a9c0 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  arget..**.** Als
1a9d0 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
1a9e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1a9f0 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f  results into ano
1aa00 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67  ther "cache" reg
1aa10 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64  ister.** and mod
1aa20 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
1aa30 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  on so that the n
1aa40 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  ext time it is e
1aa50 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65  valuated,.** the
1aa60 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70   result is a cop
1aa70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72  y of the cache r
1aa80 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
1aa90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1aaa0 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69  sed for expressi
1aab0 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65  ons that are use
1aac0 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
1aad0 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20  imes.  They are 
1aae0 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61  evaluated once a
1aaf0 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  nd the results o
1ab00 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1ab10 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a  .** are reused..
1ab20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1ab30 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
1ab40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1ab50 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1ab60 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
1ab70 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1ab80 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a  be;.  int iMem;.
1ab90 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1aba0 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
1abb0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
1abc0 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c  EGISTER );.  sql
1abd0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1abe0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1abf0 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b  et);.  iMem = ++
1ac00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1ac10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ac20 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61  2(v, OP_Copy, ta
1ac30 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65  rget, iMem);.  e
1ac40 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45  xprToRegister(pE
1ac50 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 23  xpr, iMem);.}..#
1ac60 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1ac70 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1ac80 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e  PLAIN)./*.** Gen
1ac90 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65  erate a human-re
1aca0 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69  adable explanati
1acb0 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  on of an express
1acc0 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  ion tree..*/.voi
1acd0 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e  d sqlite3Explain
1ace0 45 78 70 72 28 56 64 62 65 20 2a 70 4f 75 74 2c  Expr(Vdbe *pOut,
1acf0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
1ad00 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
1ad10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ad20 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
1ad30 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  oded */.  const 
1ad40 63 68 61 72 20 2a 7a 42 69 6e 4f 70 20 3d 20 30  char *zBinOp = 0
1ad50 3b 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 6f 70  ;   /* Binary op
1ad60 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  erator */.  cons
1ad70 74 20 63 68 61 72 20 2a 7a 55 6e 69 4f 70 20 3d  t char *zUniOp =
1ad80 20 30 3b 20 20 20 2f 2a 20 55 6e 61 72 79 20 6f   0;   /* Unary o
1ad90 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 66 28  perator */.  if(
1ada0 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
1adb0 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
1adc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
1add0 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
1ade0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1adf0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1ae00 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1ae10 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1ae20 69 6e 74 66 28 70 4f 75 74 2c 20 22 41 47 47 7b  intf(pOut, "AGG{
1ae30 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  %d:%d}",.       
1ae40 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
1ae50 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
1ae60 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
1ae70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ae80 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
1ae90 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
1aea0 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20  Table<0 ){.     
1aeb0 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20     /* This only 
1aec0 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64  happens when cod
1aed0 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72  ing check constr
1aee0 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  aints */.       
1aef0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1af00 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 4f 4c  rintf(pOut, "COL
1af10 55 4d 4e 28 25 64 29 22 2c 20 70 45 78 70 72 2d  UMN(%d)", pExpr-
1af20 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1af30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1af40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1af50 69 6e 74 66 28 70 4f 75 74 2c 20 22 7b 25 64 3a  intf(pOut, "{%d:
1af60 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %d}",.          
1af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af80 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1af90 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1afa0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1afb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1afc0 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
1afd0 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  R: {.      if( p
1afe0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
1aff0 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
1b000 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b010 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1b020 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69  "%d", pExpr->u.i
1b030 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 65  Value);.      }e
1b040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1b050 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1b060 66 28 70 4f 75 74 2c 20 22 25 73 22 2c 20 70 45  f(pOut, "%s", pE
1b070 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1b080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1b090 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1b0a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1b0b0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
1b0c0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
1b0d0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1b0e0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b0f0 75 74 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e  ut,"%s", pExpr->
1b100 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1b110 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1b120 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
1b130 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
1b140 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b150 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 51 22 2c  rintf(pOut,"%Q",
1b160 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1b170 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b180 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1b190 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
1b1a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b1b0 69 6e 74 66 28 70 4f 75 74 2c 22 4e 55 4c 4c 22  intf(pOut,"NULL"
1b1c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b1d0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1b1e0 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
1b1f0 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
1b200 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
1b210 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b220 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 22 2c  rintf(pOut,"%s",
1b230 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1b240 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b250 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1b260 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
1b270 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1b280 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1b290 70 4f 75 74 2c 22 56 41 52 49 41 42 4c 45 28 25  pOut,"VARIABLE(%
1b2a0 73 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20  s,%d)",.        
1b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2c0 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b     pExpr->u.zTok
1b2d0 65 6e 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  en, pExpr->iColu
1b2e0 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
1b2f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b300 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
1b310 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b320 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1b330 22 52 45 47 49 53 54 45 52 28 25 64 29 22 2c 20  "REGISTER(%d)", 
1b340 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
1b350 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b360 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1b370 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
1b380 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1b390 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1b3a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b3b0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1b3c0 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
1b3d0 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
1b3e0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
1b3f0 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
1b400 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
1b410 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
1b420 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1b430 2a 7a 41 66 66 20 3d 20 22 75 6e 6b 22 3b 0a 20  *zAff = "unk";. 
1b440 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
1b450 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
1b460 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1b470 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
1b480 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
1b490 54 45 58 54 3a 20 20 20 20 7a 41 66 66 20 3d 20  TEXT:    zAff = 
1b4a0 22 54 45 58 54 22 3b 20 20 20 20 20 62 72 65 61  "TEXT";     brea
1b4b0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1b4c0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a  SQLITE_AFF_NONE:
1b4d0 20 20 20 20 7a 41 66 66 20 3d 20 22 4e 4f 4e 45      zAff = "NONE
1b4e0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1b4f0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1b500 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 7a  E_AFF_NUMERIC: z
1b510 41 66 66 20 3d 20 22 4e 55 4d 45 52 49 43 22 3b  Aff = "NUMERIC";
1b520 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1b530 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1b540 5f 49 4e 54 45 47 45 52 3a 20 7a 41 66 66 20 3d  _INTEGER: zAff =
1b550 20 22 49 4e 54 45 47 45 52 22 3b 20 20 62 72 65   "INTEGER";  bre
1b560 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1b570 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
1b580 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 52 45 41  :    zAff = "REA
1b590 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  L";     break;. 
1b5a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1b5b0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1b5c0 66 28 70 4f 75 74 2c 20 22 43 41 53 54 2d 25 73  f(pOut, "CAST-%s
1b5d0 28 22 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20 20  (", zAff);.     
1b5e0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1b5f0 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  xpr(pOut, pExpr-
1b600 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
1b610 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b620 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a  ntf(pOut, ")");.
1b630 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b640 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1b650 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
1b660 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1b670 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1b680 4c 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  LT";     break;.
1b690 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
1b6a0 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c       zBinOp = "L
1b6b0 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
1b6c0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
1b6d0 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 54      zBinOp = "GT
1b6e0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1b6f0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
1b700 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 45 22     zBinOp = "GE"
1b710 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1b720 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
1b730 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4e 45 22 3b    zBinOp = "NE";
1b740 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b750 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
1b760 20 7a 42 69 6e 4f 70 20 3d 20 22 45 51 22 3b 20   zBinOp = "EQ"; 
1b770 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1b780 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20  ase TK_IS:      
1b790 7a 42 69 6e 4f 70 20 3d 20 22 49 53 22 3b 20 20  zBinOp = "IS";  
1b7a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1b7b0 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a  se TK_ISNOT:   z
1b7c0 42 69 6e 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b  BinOp = "ISNOT";
1b7d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1b7e0 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 42  e TK_AND:     zB
1b7f0 69 6e 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20  inOp = "AND";   
1b800 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1b810 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42 69   TK_OR:      zBi
1b820 6e 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20  nOp = "OR";     
1b830 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1b840 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69 6e  TK_PLUS:    zBin
1b850 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20 62  Op = "ADD";    b
1b860 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b870 4b 5f 53 54 41 52 3a 20 20 20 20 7a 42 69 6e 4f  K_STAR:    zBinO
1b880 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 62 72  p = "MUL";    br
1b890 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1b8a0 5f 4d 49 4e 55 53 3a 20 20 20 7a 42 69 6e 4f 70  _MINUS:   zBinOp
1b8b0 20 3d 20 22 53 55 42 22 3b 20 20 20 20 62 72 65   = "SUB";    bre
1b8c0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1b8d0 52 45 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20  REM:     zBinOp 
1b8e0 3d 20 22 52 45 4d 22 3b 20 20 20 20 62 72 65 61  = "REM";    brea
1b8f0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
1b900 49 54 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20 3d  ITAND:  zBinOp =
1b910 20 22 42 49 54 41 4e 44 22 3b 20 62 72 65 61 6b   "BITAND"; break
1b920 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
1b930 54 4f 52 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20  TOR:   zBinOp = 
1b940 22 42 49 54 4f 52 22 3b 20 20 62 72 65 61 6b 3b  "BITOR";  break;
1b950 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
1b960 53 48 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  SH:   zBinOp = "
1b970 44 49 56 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  DIV";    break;.
1b980 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
1b990 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c  FT:  zBinOp = "L
1b9a0 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20  SHIFT"; break;. 
1b9b0 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
1b9c0 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 53  T:  zBinOp = "RS
1b9d0 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  HIFT"; break;.  
1b9e0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
1b9f0 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 43 4f 4e  :  zBinOp = "CON
1ba00 43 41 54 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  CAT"; break;..  
1ba10 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
1ba20 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 4d 49  :  zUniOp = "UMI
1ba30 4e 55 53 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  NUS"; break;.   
1ba40 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
1ba50 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 50 4c 55    zUniOp = "UPLU
1ba60 53 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  S";  break;.    
1ba70 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20  case TK_BITNOT: 
1ba80 20 7a 55 6e 69 4f 70 20 3d 20 22 42 49 54 4e 4f   zUniOp = "BITNO
1ba90 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
1baa0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20  ase TK_NOT:     
1bab0 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 22 3b 20  zUniOp = "NOT"; 
1bac0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1bad0 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a  se TK_ISNULL:  z
1bae0 55 6e 69 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22  UniOp = "ISNULL"
1baf0 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
1bb00 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 55  e TK_NOTNULL: zU
1bb10 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22  niOp = "NOTNULL"
1bb20 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61  ; break;..    ca
1bb30 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b  se TK_COLLATE: {
1bb40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1bb50 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1bb60 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1bb70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1bb80 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1bb90 2e 43 4f 4c 4c 41 54 45 28 25 73 29 22 2c 70 45  .COLLATE(%s)",pE
1bba0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1bbb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bbc0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
1bbd0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
1bbe0 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
1bbf0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
1bc00 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
1bc10 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
1bc20 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1bc30 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78   */.      if( Ex
1bc40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1bc50 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
1bc60 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
1bc70 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
1bc80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
1bc90 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
1bca0 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
1bcb0 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41      if( op==TK_A
1bcc0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  GG_FUNCTION ){. 
1bcd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1bce0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1bcf0 2c 20 22 41 47 47 5f 46 55 4e 43 54 49 4f 4e 25  , "AGG_FUNCTION%
1bd00 64 3a 25 73 28 22 2c 0a 20 20 20 20 20 20 20 20  d:%s(",.        
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 2c       pExpr->op2,
1bd30 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1bd40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1bd50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1bd60 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1bd70 74 2c 20 22 46 55 4e 43 54 49 4f 4e 3a 25 73 28  t, "FUNCTION:%s(
1bd80 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
1bd90 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  en);.      }.   
1bda0 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
1bdb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1bdc0 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
1bdd0 4f 75 74 2c 20 70 46 61 72 67 29 3b 0a 20 20 20  Out, pFarg);.   
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 29 22 29 3b 0a 20 20 20 20  pOut, ")");.    
1be10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1be20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1be30 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1be40 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 20  case TK_EXISTS: 
1be50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1be60 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1be70 74 2c 20 22 45 58 49 53 54 53 28 22 29 3b 0a 20  t, "EXISTS(");. 
1be80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1be90 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20  ainSelect(pOut, 
1bea0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1beb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bec0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1bed0 75 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 62  ut,")");.      b
1bee0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1bef0 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
1bf00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1bf10 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1bf20 74 2c 20 22 28 22 29 3b 0a 20 20 20 20 20 20 73  t, "(");.      s
1bf30 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c  qlite3ExplainSel
1bf40 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  ect(pOut, pExpr-
1bf50 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
1bf60 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1bf70 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29  nPrintf(pOut, ")
1bf80 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1bf90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bfa0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73  TK_IN: {.      s
1bfb0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1bfc0 6e 74 66 28 70 4f 75 74 2c 20 22 49 4e 28 22 29  ntf(pOut, "IN(")
1bfd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1bfe0 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1bff0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1c000 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c010 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c020 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 69 66 28   ",");.      if(
1c030 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1c040 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1c050 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
1c060 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
1c070 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70  elect(pOut, pExp
1c080 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
1c090 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c0a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c0b0 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c  inExprList(pOut,
1c0c0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
1c0d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c0e0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1c0f0 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b  intf(pOut, ")");
1c100 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c110 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1c120 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1c130 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20  RY */..    /*.  
1c140 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
1c150 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
1c160 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
1c170 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
1c180 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
1c190 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
1c1a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
1c1b0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
1c1c0 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
1c1d0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1c1e0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
1c1f0 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
1c200 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1c210 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
1c220 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
1c230 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1c240 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
1c250 20 2a 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   *pX = pExpr->pL
1c260 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
1c270 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pY = pExpr->x.p
1c280 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1c290 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 5a  ;.      Expr *pZ
1c2a0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1c2b0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
1c2c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c2d0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1c2e0 22 42 45 54 57 45 45 4e 28 22 29 3b 0a 20 20 20  "BETWEEN(");.   
1c2f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c300 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 58 29 3b  nExpr(pOut, pX);
1c310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1c320 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1c330 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71  , ",");.      sq
1c340 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1c350 28 70 4f 75 74 2c 20 70 59 29 3b 0a 20 20 20 20  (pOut, pY);.    
1c360 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c370 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22  Printf(pOut, ","
1c380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c390 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1c3a0 2c 20 70 5a 29 3b 0a 20 20 20 20 20 20 73 71 6c  , pZ);.      sql
1c3b0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1c3c0 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20  f(pOut, ")");.  
1c3d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c3e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49  .    case TK_TRI
1c3f0 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  GGER: {.      /*
1c400 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69   If the opcode i
1c410 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68  s TK_TRIGGER, th
1c420 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
1c430 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  n is a reference
1c440 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63  .      ** to a c
1c450 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
1c460 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75  .* or old.* pseu
1c470 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61  do-tables availa
1c480 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
1c490 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
1c4a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45  . In this case E
1c4b0 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65  xpr.iTable is se
1c4c0 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20  t to 1 for the. 
1c4d0 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73       ** new.* ps
1c4e0 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30  eudo-table, or 0
1c4f0 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70   for the old.* p
1c500 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70  seudo-table. Exp
1c510 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  r.iColumn.      
1c520 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
1c530 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70   column of the p
1c540 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72  seudo-table to r
1c550 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f  ead, or to -1 to
1c560 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74  .      ** read t
1c570 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a  he rowid field..
1c580 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1c590 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1c5a0 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 28 25 64  ntf(pOut, "%s(%d
1c5b0 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  )", .          p
1c5c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
1c5d0 4e 45 57 22 20 3a 20 22 4f 4c 44 22 2c 20 70 45  NEW" : "OLD", pE
1c5e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1c5f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c600 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  }.    case TK_CA
1c610 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SE: {.      sqli
1c620 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1c630 28 70 4f 75 74 2c 20 22 43 41 53 45 28 22 29 3b  (pOut, "CASE(");
1c640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1c650 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1c660 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c670 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c680 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1c690 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ",");.      sqli
1c6a0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
1c6b0 73 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  st(pOut, pExpr->
1c6c0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
1c6d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1c6e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c6f0 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
1c700 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
1c710 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c720 7a 54 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20  zType = "unk";. 
1c730 20 20 20 20 20 73 77 69 74 63 68 28 20 70 45 78       switch( pEx
1c740 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a  pr->affinity ){.
1c750 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f          case OE_
1c760 52 6f 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70  Rollback:   zTyp
1c770 65 20 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20  e = "rollback"; 
1c780 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1c790 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20  case OE_Abort:  
1c7a0 20 20 20 20 7a 54 79 70 65 20 3d 20 22 61 62 6f      zType = "abo
1c7b0 72 74 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  rt";     break;.
1c7c0 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f          case OE_
1c7d0 46 61 69 6c 3a 20 20 20 20 20 20 20 7a 54 79 70  Fail:       zTyp
1c7e0 65 20 3d 20 22 66 61 69 6c 22 3b 20 20 20 20 20  e = "fail";     
1c7f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1c800 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20  case OE_Ignore: 
1c810 20 20 20 20 7a 54 79 70 65 20 3d 20 22 69 67 6e      zType = "ign
1c820 6f 72 65 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ore";    break;.
1c830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1c840 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1c850 74 66 28 70 4f 75 74 2c 20 22 52 41 49 53 45 2d  tf(pOut, "RAISE-
1c860 25 73 28 25 73 29 22 2c 20 7a 54 79 70 65 2c 20  %s(%s)", zType, 
1c870 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1c880 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c890 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1c8a0 20 20 69 66 28 20 7a 42 69 6e 4f 70 20 29 7b 0a    if( zBinOp ){.
1c8b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c8c0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
1c8d0 73 28 22 2c 20 7a 42 69 6e 4f 70 29 3b 0a 20 20  s(", zBinOp);.  
1c8e0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c8f0 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1c900 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
1c910 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1c920 74 66 28 70 4f 75 74 2c 22 2c 22 29 3b 0a 20 20  tf(pOut,",");.  
1c930 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c940 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1c950 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 73  ->pRight);.    s
1c960 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1c970 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20  ntf(pOut,")");. 
1c980 20 7d 65 6c 73 65 20 69 66 28 20 7a 55 6e 69 4f   }else if( zUniO
1c990 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
1c9a0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1c9b0 75 74 2c 22 25 73 28 22 2c 20 7a 55 6e 69 4f 70  ut,"%s(", zUniOp
1c9c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1c9d0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1c9e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c9f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1ca00 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22  nPrintf(pOut,")"
1ca10 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
1ca20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1ca30 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1ca40 50 4c 41 49 4e 29 20 2a 2f 0a 0a 23 69 66 20 64  PLAIN) */..#if d
1ca50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1ca60 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
1ca70 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  N)./*.** Generat
1ca80 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
1ca90 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  le explanation o
1caa0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
1cab0 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
1cac0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1cad0 4c 69 73 74 28 56 64 62 65 20 2a 70 4f 75 74 2c  List(Vdbe *pOut,
1cae0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1caf0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1cb00 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c  ( pList==0 || pL
1cb10 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 7b  ist->nExpr==0 ){
1cb20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1cb30 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1cb40 22 28 65 6d 70 74 79 2d 6c 69 73 74 29 22 29 3b  "(empty-list)");
1cb50 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1cb60 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e  else if( pList->
1cb70 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
1cb80 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1cb90 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e  pr(pOut, pList->
1cba0 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  a[0].pExpr);.  }
1cbb0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1cbc0 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 4f 75  3ExplainPush(pOu
1cbd0 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  t);.    for(i=0;
1cbe0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1cbf0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1cc00 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1cc10 66 28 70 4f 75 74 2c 20 22 69 74 65 6d 5b 25 64  f(pOut, "item[%d
1cc20 5d 20 3d 20 22 2c 20 69 29 3b 0a 20 20 20 20 20  ] = ", i);.     
1cc30 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1cc40 75 73 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 20  ush(pOut);.     
1cc50 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1cc60 78 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d  xpr(pOut, pList-
1cc70 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1cc80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1cc90 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 20  inPop(pOut);.   
1cca0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
1ccb0 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
1ccc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ccd0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1cce0 20 41 53 20 25 73 22 2c 20 70 4c 69 73 74 2d 3e   AS %s", pList->
1ccf0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
1cd00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1cd10 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62 53 70 61 6e  List->a[i].bSpan
1cd20 49 73 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  IsTab ){.       
1cd30 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1cd40 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 20 28 25  rintf(pOut, " (%
1cd50 73 29 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  s)", pList->a[i]
1cd60 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
1cd70 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 4c 69  .      if( i<pLi
1cd80 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  st->nExpr-1 ){. 
1cd90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1cda0 70 6c 61 69 6e 4e 4c 28 70 4f 75 74 29 3b 0a 20  plainNL(pOut);. 
1cdb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1cdc0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1cdd0 6f 70 28 70 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a  op(pOut);.  }.}.
1cde0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1cdf0 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ce00 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1ce10 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
1ce20 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
1ce30 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
1ce40 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
1ce50 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71   list into a seq
1ce60 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
1ce70 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  rs beginning at 
1ce80 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  target..**.** Re
1ce90 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1cea0 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c  of elements eval
1ceb0 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uated..**.** The
1cec0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
1ced0 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
1cee0 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f  he arguments fro
1cef0 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65  m being.** fille
1cf00 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79  d using OP_SCopy
1cf10 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20  .  OP_Copy must 
1cf20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  be used instead.
1cf30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
1cf40 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72  E_ECEL_FACTOR ar
1cf50 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f  gument allows co
1cf60 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
1cf70 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72   to be.** factor
1cf80 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74  ed out into init
1cf90 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e  ialization code.
1cfa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
1cfb0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1cfc0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1cfd0 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
1cfe0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1cff0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
1d000 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1d010 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f  on list to be co
1d020 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72  ded */.  int tar
1d030 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57  get,        /* W
1d040 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65  here to write re
1d050 73 75 6c 74 73 20 2a 2f 0a 20 20 75 38 20 66 6c  sults */.  u8 fl
1d060 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
1d070 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66   SQLITE_ECEL_* f
1d080 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lags */.){.  str
1d090 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1d0a0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1d0b0 69 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f  i, n;.  u8 copyO
1d0c0 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c  p = (flags & SQL
1d0d0 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20  ITE_ECEL_DUP) ? 
1d0e0 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f  OP_Copy : OP_SCo
1d0f0 70 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  py;.  assert( pL
1d100 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ist!=0 );.  asse
1d110 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
1d120 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1d130 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f  ->pVdbe!=0 );  /
1d140 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69  * Never gets thi
1d150 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20  s far otherwise 
1d160 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  */.  n = pList->
1d170 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f  nExpr;.  if( !Co
1d180 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
1d190 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e  se) ) flags &= ~
1d1a0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
1d1b0 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  OR;.  for(pItem=
1d1c0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1d1d0 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
1d1e0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
1d1f0 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
1d200 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  r;.    if( (flag
1d210 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
1d220 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71  FACTOR)!=0 && sq
1d230 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1d240 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
1d250 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1d260 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
1d270 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
1d280 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  i, 0);.    }else
1d290 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65  {.      int inRe
1d2a0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1d2b0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1d2c0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
1d2d0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  i);.      if( in
1d2e0 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b  Reg!=target+i ){
1d2f0 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
1d300 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 56 64  *pOp;.        Vd
1d310 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1d320 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 69  pVdbe;.        i
1d330 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f  f( copyOp==OP_Co
1d340 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  py.         && (
1d350 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47  pOp=sqlite3VdbeG
1d360 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70  etOp(v, -1))->op
1d370 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  code==OP_Copy.  
1d380 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
1d390 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52  1+pOp->p3+1==inR
1d3a0 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
1d3b0 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31  Op->p2+pOp->p3+1
1d3c0 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20  ==target+i.     
1d3d0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1d3e0 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20  pOp->p3++;.     
1d3f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d410 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
1d420 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69   inReg, target+i
1d430 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d440 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1d450 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
1d460 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1d470 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
1d480 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
1d490 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
1d4a0 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
1d4b0 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
1d4c0 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
1d4d0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
1d4e0 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
1d4f0 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
1d500 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
1d510 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
1d520 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20  ** elementation 
1d530 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of x..*/.static 
1d540 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74  void exprCodeBet
1d550 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  ween(.  Parse *p
1d560 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
1d570 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1d580 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1d590 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1d5a0 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42  r,      /* The B
1d5b0 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f  ETWEEN expressio
1d5c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  n */.  int dest,
1d5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1d5e0 20 68 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d   here if the jum
1d5f0 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  p is taken */.  
1d600 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20  int jumpIfTrue, 
1d610 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75    /* Take the ju
1d620 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45  mp if the BETWEE
1d630 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69  N is true */.  i
1d640 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
1d650 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
1d660 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
1d670 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
1d680 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20   Expr exprAnd;  
1d690 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70     /* The AND op
1d6a0 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20  erator in  x>=y 
1d6b0 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45  AND x<=z  */.  E
1d6c0 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20  xpr compLeft;   
1d6d0 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74   /* The  x>=y  t
1d6e0 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  erm */.  Expr co
1d6f0 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68  mpRight;   /* Th
1d700 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f  e  x<=z  term */
1d710 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20  .  Expr exprX;  
1d720 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20       /* The  x  
1d730 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
1d740 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1d750 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72  = 0; /* Temporar
1d760 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a  y use register *
1d770 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  /..  assert( !Ex
1d780 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1d790 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1d7a0 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20  t) );.  exprX = 
1d7b0 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
1d7c0 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
1d7d0 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e  _AND;.  exprAnd.
1d7e0 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
1d7f0 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69  t;.  exprAnd.pRi
1d800 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
1d810 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20  ;.  compLeft.op 
1d820 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c  = TK_GE;.  compL
1d830 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
1d840 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  rX;.  compLeft.p
1d850 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
1d860 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
1d870 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  pr;.  compRight.
1d880 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
1d890 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
1d8a0 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
1d8b0 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
1d8c0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
1d8d0 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54  ].pExpr;.  exprT
1d8e0 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58  oRegister(&exprX
1d8f0 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
1d900 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
1d910 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
1d920 29 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49 66 54  );.  if( jumpIfT
1d930 72 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rue ){.    sqlit
1d940 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1d950 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
1d960 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1d970 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1d980 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1d990 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
1d9a0 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
1d9b0 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Null);.  }.  sql
1d9c0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1d9d0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1d9e0 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75  ee1);..  /* Ensu
1d9f0 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74  re adequate test
1da00 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74   coverage */.  t
1da10 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1da20 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1da30 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1da40 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
1da50 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1da60 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1da70 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1da80 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
1da90 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1daa0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1dab0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1dac0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1dad0 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1dae0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1daf0 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1db00 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1db10 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1db20 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1db30 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1db40 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1db50 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1db60 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1db70 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
1db80 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1db90 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1dba0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1dbb0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1dbc0 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1dbd0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1dbe0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1dbf0 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  0 );.}../*.** Ge
1dc00 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1dc10 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
1dc20 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
1dc30 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
1dc40 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
1dc50 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
1dc60 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
1dc70 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
1dc80 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
1dc90 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
1dca0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
1dcb0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
1dcc0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
1dcd0 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
1dce0 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
1dcf0 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
1dd00 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
1dd10 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
1dd20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a  flag is SQLITE_J
1dd30 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  UMPIFNULL..**.**
1dd40 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
1dd50 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
1dd60 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65  hat certain toke
1dd70 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b  n values (ex: TK
1dd80 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20  _EQ).** are the 
1dd90 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76  same as opcode v
1dda0 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71  alues (ex: OP_Eq
1ddb0 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  ) that implement
1ddc0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
1ddd0 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  ng.** operation.
1dde0 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e    Special commen
1ddf0 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64  ts in vdbe.c and
1de00 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
1de10 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20  wk script in.** 
1de20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73  the make process
1de30 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c   cause these val
1de40 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41  ues to align.  A
1de50 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20  ssert()s in the 
1de60 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65  code.** below ve
1de70 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
1de80 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65  mbers are aligne
1de90 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  d correctly..*/.
1dea0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1deb0 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
1dec0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1ded0 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
1dee0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
1def0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1df00 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
1df10 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
1df20 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
1df30 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
1df40 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
1df50 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
1df60 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
1df70 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
1df80 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
1df90 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20  NEVER(v==0) )   
1dfa0 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78    return;  /* Ex
1dfb0 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
1dfc0 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
1dfd0 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  r */.  if( NEVER
1dfe0 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74  (pExpr==0) ) ret
1dff0 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20  urn;  /* No way 
1e000 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
1e010 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  */.  op = pExpr-
1e020 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
1e030 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1e040 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _AND: {.      in
1e050 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
1e060 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1e070 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e080 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1e090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e0a0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1e0b0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1e0c0 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  d2,jumpIfNull^SQ
1e0d0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1e0e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e0f0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1e100 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1e110 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1e120 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1e130 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1e140 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1e150 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1e160 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
1e170 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e180 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1e190 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e1a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e1b0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OR: {.      test
1e1c0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1e1d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1e1e0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1e1f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e200 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
1e210 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1e220 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1e230 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1e240 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1e250 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1e260 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
1e270 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1e280 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e290 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1e2a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e2b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e2c0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
1e2d0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1e2e0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1e2f0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1e300 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e310 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1e320 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1e330 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e340 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1e350 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1e360 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1e370 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1e380 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1e390 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1e3a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1e3b0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1e3c0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1e3d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e3e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e3f0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1e400 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1e410 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e420 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e430 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1e440 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
1e450 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1e460 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
1e470 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e490 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
1e4a0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1e4b0 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
1e4c0 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
1e4d0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
1e4e0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1e4f0 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
1e500 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
1e510 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
1e520 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
1e530 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e540 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
1e550 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
1e560 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1e570 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
1e580 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1e590 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
1e5a0 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
1e5b0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1e5c0 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
1e5d0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
1e5e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e5f0 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
1e600 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
1e610 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
1e620 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
1e630 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1e640 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
1e650 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
1e660 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e670 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
1e680 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e690 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1e6a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1e6b0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1e6c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e6d0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1e6e0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1e6f0 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1e700 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
1e710 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e720 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
1e730 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1e740 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e750 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e760 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1e770 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1e780 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e790 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e7a0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1e7b0 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  e2);.      op = 
1e7c0 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
1e7d0 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
1e7e0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1e7f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e800 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1e810 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1e820 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1e830 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e  , dest, SQLITE_N
1e840 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
1e850 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1e860 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20  op==TK_EQ);.    
1e870 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1e880 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a  (v, op==TK_NE);.
1e890 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e8a0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e8b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e8c0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1e8d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e8e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1e8f0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1e900 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1e910 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
1e920 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
1e930 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1e940 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
1e950 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e960 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
1e970 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
1e980 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
1e990 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1e9a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e9b0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e9c0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1e9d0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1e9e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
1e9f0 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
1ea00 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ea10 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
1ea20 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
1ea30 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1ea40 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
1ea50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1ea60 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1ea70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ea80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
1ea90 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
1eaa0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1eab0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
1eac0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
1ead0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1eae0 73 74 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c  st, 1, jumpIfNul
1eaf0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1eb00 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1eb10 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1eb20 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
1eb30 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
1eb40 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
1eb50 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1eb60 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
1eb70 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
1eb80 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
1eb90 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
1eba0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ebb0 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
1ebc0 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
1ebd0 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
1ebe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ebf0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1ec00 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  to, 0, dest);.  
1ec10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1ec20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1ec30 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
1ec40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ec50 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
1ec60 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  lt: {.      if( 
1ec70 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
1ec80 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1ec90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1eca0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1ecb0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
1ecc0 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
1ecd0 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
1ece0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
1ecf0 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
1ed00 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
1ed10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ed20 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1ed30 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
1ed40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ed50 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1ed60 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  If, r1, dest, ju
1ed70 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
1ed80 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1ed90 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  ge(v);.        t
1eda0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1edb0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
1edc0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1edd0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1ede0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1edf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1ee00 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1ee10 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1ee20 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
1ee30 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1ee40 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20  rse, regFree2); 
1ee50 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   .}../*.** Gener
1ee60 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
1ee70 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
1ee80 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
1ee90 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
1eea0 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
1eeb0 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
1eec0 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
1eed0 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
1eee0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
1eef0 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
1ef00 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
1ef10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
1ef20 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
1ef30 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
1ef40 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
1ef50 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
1ef60 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
1ef70 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
1ef80 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f  ULL or fall thro
1ef90 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ugh if jumpIfNul
1efa0 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f  l.** is 0..*/.vo
1efb0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
1efc0 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61  False(Parse *pPa
1efd0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1efe0 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
1eff0 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
1f000 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1f010 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
1f020 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1f030 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
1f040 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
1f050 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
1f060 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
1f070 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
1f080 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
1f090 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
1f0a0 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
1f0b0 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63  urn; /* Existenc
1f0c0 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
1f0d0 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
1f0e0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1f0f0 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a     return;..  /*
1f100 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45   The value of pE
1f110 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61  xpr->op and op a
1f120 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f  re related as fo
1f130 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
1f140 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1f150 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20              op. 
1f160 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d   **       ------
1f170 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  ---          ---
1f180 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20  -------.  **    
1f190 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20     TK_ISNULL    
1f1a0 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c        OP_NotNull
1f1b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
1f1c0 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f  OTNULL         O
1f1d0 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  P_IsNull.  **   
1f1e0 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20      TK_NE       
1f1f0 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a         OP_Eq.  *
1f200 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20  *       TK_EQ   
1f210 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65             OP_Ne
1f220 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
1f230 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
1f240 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Le.  **       
1f250 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20  TK_LE           
1f260 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20     OP_Gt.  **   
1f270 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20      TK_GE       
1f280 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a         OP_Lt.  *
1f290 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20  *       TK_LT   
1f2a0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65             OP_Ge
1f2b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f  .  **.  ** For o
1f2c0 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70  ther values of p
1f2d0 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20  Expr->op, op is 
1f2e0 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e  undefined and un
1f2f0 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76  used..  ** The v
1f300 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20  alue of TK_ and 
1f310 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  OP_ constants ar
1f320 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20  e arranged such 
1f330 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e  that we.  ** can
1f340 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70   compute the map
1f350 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67  ping above using
1f360 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
1f370 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20  xpression..  ** 
1f380 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79  Assert()s verify
1f390 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74   that the comput
1f3a0 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74  ation is correct
1f3b0 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28  ..  */.  op = ((
1f3c0 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53  pExpr->op+(TK_IS
1f3d0 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f  NULL&1))^1)-(TK_
1f3e0 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a  ISNULL&1);..  /*
1f3f0 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20   Verify correct 
1f400 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f  alignment of TK_
1f410 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
1f420 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
1f430 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1f440 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  ISNULL || op==OP
1f450 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  _NotNull );.  as
1f460 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1f470 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f  =TK_NOTNULL || o
1f480 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  p==OP_IsNull );.
1f490 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1f4a0 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70  >op!=TK_NE || op
1f4b0 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73  ==OP_Eq );.  ass
1f4c0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1f4d0 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_EQ || op==OP_
1f4e0 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ne );.  assert( 
1f4f0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54  pExpr->op!=TK_LT
1f500 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b   || op==OP_Ge );
1f510 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1f520 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f  ->op!=TK_LE || o
1f530 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73  p==OP_Gt );.  as
1f540 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1f550 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GT || op==OP
1f560 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Le );.  assert(
1f570 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
1f580 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29  E || op==OP_Lt )
1f590 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
1f5a0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
1f5b0 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
1f5c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f5d0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f5e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1f5f0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1f600 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1f610 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1f620 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f630 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1f640 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1f650 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1f660 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1f670 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1f680 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1f690 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1f6a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1f6b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f6c0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
1f6d0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
1f6e0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1f6f0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
1f700 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1f710 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1f720 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1f730 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f740 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
1f750 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
1f760 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
1f770 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1f780 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1f790 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1f7a0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1f7b0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1f7c0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1f7d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f7e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1f7f0 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
1f800 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1f810 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
1f820 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f830 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
1f840 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1f850 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1f860 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f870 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1f880 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
1f890 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1f8a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f8b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f8c0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
1f8d0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
1f8e0 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
1f8f0 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
1f900 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
1f910 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EQ: {.      test
1f920 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f930 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
1f940 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f950 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f960 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1f970 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1f980 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f990 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f9a0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1f9b0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1f9c0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1f9d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f9e0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f9f0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1fa00 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1fa10 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1fa20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1fa30 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
1fa40 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
1fa50 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1fa60 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
1fa70 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1fa80 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
1fa90 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
1faa0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1fab0 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
1fac0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
1fad0 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
1fae0 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
1faf0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1fb00 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
1fb10 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
1fb20 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
1fb30 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
1fb40 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1fb50 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
1fb60 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
1fb70 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
1fb80 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
1fb90 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1fba0 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73  OP_Eq);.      as
1fbb0 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
1fbc0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1fbd0 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ne); VdbeCov
1fbe0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1fbf0 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _Ne);.      test
1fc00 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1fc10 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1fc20 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1fc30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1fc40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1fc50 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
1fc60 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20  TK_ISNOT: {.    
1fc70 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
1fc80 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
1fc90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fca0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1fcb0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
1fcc0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fcd0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1fce0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1fcf0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1fd00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fd10 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1fd20 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1fd30 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1fd40 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d  op = (pExpr->op=
1fd50 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20  =TK_IS) ? TK_NE 
1fd60 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63  : TK_EQ;.      c
1fd70 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1fd80 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1fd90 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1fda0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1fdb0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
1fdc0 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  st, SQLITE_NULLE
1fdd0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
1fde0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1fdf0 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64  TK_EQ);.      Vd
1fe00 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1fe10 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20  op==TK_NE);.    
1fe20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1fe30 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1fe40 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1fe50 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1fe60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1fe70 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
1fe80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1fe90 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31  NULL: {.      r1
1fea0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1feb0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1fec0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1fed0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
1fee0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1fef0 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
1ff00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ff10 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
1ff20 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61   );   VdbeCovera
1ff30 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
1ff40 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  SNULL);.      te
1ff50 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1ff60 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43  OTNULL );  VdbeC
1ff70 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1ff80 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
1ff90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1ffa0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1ffb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ffc0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
1ffd0 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
1ffe0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1fff0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
20000 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
20010 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
20020 74 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  t, 0, jumpIfNull
20030 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20040 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
20050 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
20060 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  RY.    case TK_I
20070 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a  N: {.      if( j
20080 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  umpIfNull ){.   
20090 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
200a0 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
200b0 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
200c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
200d0 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74          int dest
200e0 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
200f0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20100 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20110 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
20120 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
20130 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
20140 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20150 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
20160 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
20170 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
20180 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
20190 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
201a0 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
201b0 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
201c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
201d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
201e0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
201f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
20200 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  f( exprAlwaysTru
20210 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
20220 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
20230 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20240 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
20250 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
20260 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
20270 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
20280 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20290 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p3(v, OP_IfNot, 
202a0 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
202b0 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
202c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
202d0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
202e0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
202f0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
20300 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
20310 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
20320 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20330 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
20340 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
20350 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
20360 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
20370 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
20380 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f   regFree2);.}../
20390 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63  *.** Do a deep c
203a0 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f  omparison of two
203b0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
203c0 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
203d0 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65  the two.** expre
203e0 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c  ssions are compl
203f0 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e  etely identical.
20400 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
20410 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a  ey differ only.*
20420 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f  * by a COLLATE o
20430 70 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74  perator at the t
20440 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72  op level.  Retur
20450 6e 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65  n 2 if there are
20460 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20   differences.** 
20470 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74  other than the t
20480 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45  op-level COLLATE
20490 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
204a0 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65   If any subeleme
204b0 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70  nt of pB has Exp
204c0 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74  r.iTable==(-1) t
204d0 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65  hen it is allowe
204e0 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20  d.** to compare 
204f0 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69  equal to an equi
20500 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69  valent element i
20510 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69  n pA with Expr.i
20520 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a  Table==iTab..**.
20530 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65 20 6d  ** The pA side m
20540 69 67 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b  ight be using TK
20550 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66 20 74  _REGISTER.  If t
20560 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 20  hat is the case 
20570 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74  and pB is.** not
20580 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
20590 45 52 20 62 75 74 20 69 73 20 6f 74 68 65 72 77  ER but is otherw
205a0 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20  ise equivalent, 
205b0 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
205c0 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  n 0..**.** Somet
205d0 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e  imes this routin
205e0 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20  e will return 2 
205f0 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20  even if the two 
20600 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72  expressions.** r
20610 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61  eally are equiva
20620 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e  lent.  If we can
20630 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74  not prove that t
20640 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
20650 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c  re.** identical,
20660 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73   we return 2 jus
20670 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53  t to be safe.  S
20680 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
20690 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20  e.** returns 2, 
206a0 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20  then you do not 
206b0 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20  really know for 
206c0 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74  certain if the t
206d0 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  wo.** expression
206e0 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
206f0 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20   But if you get 
20700 61 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c  a 0 or 1 return,
20710 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e   then you.** can
20720 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70   be sure the exp
20730 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
20740 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70   same.  In the p
20750 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74  laces where.** t
20760 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
20770 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  sed, it does not
20780 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20   hurt to get an 
20790 65 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a  extra 2 - that.*
207a0 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73  * just might res
207b0 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67  ult in some slig
207c0 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65  htly slower code
207d0 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67  .  But returning
207e0 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74  .** an incorrect
207f0 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65   0 or 1 could le
20800 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74  ad to a malfunct
20810 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
20820 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45  te3ExprCompare(E
20830 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70  xpr *pA, Expr *p
20840 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
20850 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  u32 combinedFlag
20860 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c  s;.  if( pA==0 |
20870 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72  | pB==0 ){.    r
20880 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30  eturn pB==pA ? 0
20890 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62   : 2;.  }.  comb
208a0 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e  inedFlags = pA->
208b0 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67  flags | pB->flag
208c0 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  s;.  if( combine
208d0 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  dFlags & EP_IntV
208e0 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20  alue ){.    if( 
208f0 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66  (pA->flags&pB->f
20900 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65  lags&EP_IntValue
20910 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56  )!=0 && pA->u.iV
20920 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c  alue==pB->u.iVal
20930 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ue ){.      retu
20940 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
20950 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
20960 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
20970 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  op ){.    if( pA
20980 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
20990 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
209a0 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
209b0 2c 20 70 42 2c 20 69 54 61 62 29 3c 32 20 29 7b  , pB, iTab)<2 ){
209c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
209d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
209e0 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  B->op==TK_COLLAT
209f0 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  E && sqlite3Expr
20a00 43 6f 6d 70 61 72 65 28 70 41 2c 20 70 42 2d 3e  Compare(pA, pB->
20a10 70 4c 65 66 74 2c 20 69 54 61 62 29 3c 32 20 29  pLeft, iTab)<2 )
20a20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
20a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
20a40 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
20a50 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pA->op!=TK_COLUM
20a60 4e 20 26 26 20 41 4c 57 41 59 53 28 70 41 2d 3e  N && ALWAYS(pA->
20a70 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
20a80 4e 29 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b  N) && pA->u.zTok
20a90 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  en ){.    if( st
20aa0 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65  rcmp(pA->u.zToke
20ab0 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21  n,pB->u.zToken)!
20ac0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
20ad0 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  rn pA->op==TK_CO
20ae0 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20  LLATE ? 1 : 2;. 
20af0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
20b00 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pA->flags & EP_D
20b10 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66  istinct)!=(pB->f
20b20 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
20b30 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ct) ) return 2;.
20b40 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
20b50 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
20b60 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20  _TokenOnly)==0) 
20b70 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69  ){.    if( combi
20b80 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49  nedFlags & EP_xI
20b90 73 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  sSelect ) return
20ba0 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
20bb0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
20bc0 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
20bd0 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  eft, iTab) ) ret
20be0 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
20bf0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
20c00 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  e(pA->pRight, pB
20c10 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
20c20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
20c30 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
20c40 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78  istCompare(pA->x
20c50 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c  .pList, pB->x.pL
20c60 69 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ist, iTab) ) ret
20c70 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 41  urn 2;.    if( A
20c80 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46  LWAYS((combinedF
20c90 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65  lags & EP_Reduce
20ca0 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  d)==0) ){.      
20cb0 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21  if( pA->iColumn!
20cc0 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72  =pB->iColumn ) r
20cd0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69  eturn 2;.      i
20ce0 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70  f( pA->iTable!=p
20cf0 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20  B->iTable .     
20d00 20 20 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65    && (pA->iTable
20d10 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28  !=iTab || NEVER(
20d20 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20  pB->iTable>=0)) 
20d30 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
20d40 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
20d50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
20d60 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  re two ExprList 
20d70 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e  objects.  Return
20d80 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20 69   0 if they are i
20d90 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a  dentical and .**
20da0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
20db0 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20  y differ in any 
20dc0 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  way..**.** If an
20dd0 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20  y subelement of 
20de0 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62  pB has Expr.iTab
20df0 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74  le==(-1) then it
20e00 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
20e10 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  o compare equal 
20e20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  to an equivalent
20e30 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77   element in pA w
20e40 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  ith Expr.iTable=
20e50 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  =iTab..**.** Thi
20e60 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
20e70 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
20e80 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45  for equivalent E
20e90 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a  xprLists.  The.*
20ea0 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e  * only consequen
20eb0 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62  ce will be disab
20ec0 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  led optimization
20ed0 73 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  s.  But this rou
20ee0 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76  tine.** must nev
20ef0 65 72 20 72 65 74 75 72 6e 20 30 20 69 66 20 74  er return 0 if t
20f00 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  he two ExprList 
20f10 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69 66 66  objects are diff
20f20 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d  erent, or.** a m
20f30 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  alfunction will 
20f40 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77  result..**.** Tw
20f50 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20  o NULL pointers 
20f60 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
20f70 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20  o be the same.  
20f80 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  But a NULL point
20f90 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66  er.** always dif
20fa0 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  fers from a non-
20fb0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
20fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
20fd0 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72  ListCompare(Expr
20fe0 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69  List *pA, ExprLi
20ff0 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  st *pB, int iTab
21000 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
21010 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30  ( pA==0 && pB==0
21020 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
21030 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
21040 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
21050 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70  if( pA->nExpr!=p
21060 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72  B->nExpr ) retur
21070 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 1;.  for(i=0; 
21080 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  i<pA->nExpr; i++
21090 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
210a0 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70  prA = pA->a[i].p
210b0 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
210c0 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69  pExprB = pB->a[i
210d0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
210e0 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72   pA->a[i].sortOr
210f0 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f  der!=pB->a[i].so
21100 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e  rtOrder ) return
21110 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
21120 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
21130 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69  ExprA, pExprB, i
21140 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Tab) ) return 1;
21150 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
21160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21170 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e 20   true if we can 
21180 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77 69  prove the pE2 wi
21190 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ll always be tru
211a0 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74  e if pE1 is.** t
211b0 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  rue.  Return fal
211c0 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  se if we cannot 
211d0 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f  complete the pro
211e0 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67  of or if pE2 mig
211f0 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20  ht.** be false. 
21200 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
21210 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20       pE1: x==5  
21220 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
21230 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
21240 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
21250 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70  E1: x>0        p
21260 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
21270 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c       Result: fal
21280 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  se.**     pE1: x
21290 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20 78  =21       pE2: x
212a0 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20  =21 OR y=43     
212b0 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
212c0 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20      pE1: x!=123 
212d0 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
212e0 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
212f0 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
21300 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45  1: x!=?1      pE
21310 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
21320 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
21330 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
21340 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49  S NULL  pE2: x I
21350 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
21360 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20  sult: false.**  
21370 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20     pE1: x IS ?2 
21380 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
21390 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a   NULL    Reuslt:
213a0 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65   false.**.** Whe
213b0 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43  n comparing TK_C
213c0 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77  OLUMN nodes betw
213d0 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c  een pE1 and pE2,
213e0 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45   if pE2 has.** E
213f0 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65  xpr.iTable<0 the
21400 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65  n assume a table
21410 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79   number given by
21420 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   iTab..**.** Whe
21430 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75  n in doubt, retu
21440 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72  rn false.  Retur
21450 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20  ning true might 
21460 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
21470 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e  ce.** improvemen
21480 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61  t.  Returning fa
21490 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73 65 20  lse might cause 
214a0 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  a performance re
214b0 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  duction, but.** 
214c0 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67  it will always g
214d0 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  ive the correct 
214e0 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68 65  answer and is he
214f0 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e  nce always safe.
21500 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
21510 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 45  xprImpliesExpr(E
21520 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a  xpr *pE1, Expr *
21530 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  pE2, int iTab){.
21540 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
21550 72 43 6f 6d 70 61 72 65 28 70 45 31 2c 20 70 45  rCompare(pE1, pE
21560 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20  2, iTab)==0 ){. 
21570 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
21580 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
21590 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c  TK_OR.   && (sql
215a0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
215b0 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c  xpr(pE1, pE2->pL
215c0 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20  eft, iTab).     
215d0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
215e0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
215f0 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67  r(pE1, pE2->pRig
21600 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b  ht, iTab) ).  ){
21610 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
21620 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70   }.  if( pE2->op
21630 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20  ==TK_NOTNULL.   
21640 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
21650 6d 70 61 72 65 28 70 45 31 2d 3e 70 4c 65 66 74  mpare(pE1->pLeft
21660 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54  , pE2->pLeft, iT
21670 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 45  ab)==0.   && (pE
21680 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  1->op!=TK_ISNULL
21690 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f   && pE1->op!=TK_
216a0 49 53 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  IS).  ){.    ret
216b0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
216c0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
216d0 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
216e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
216f0 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62  ucture is used b
21700 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65  y the tree walke
21710 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65  r.** to count re
21720 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c  ferences to tabl
21730 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
21740 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e   arguments of an
21750 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66   .** aggregate f
21760 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65  unction, in orde
21770 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  r to implement t
21780 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e  he.** sqlite3Fun
21790 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72  ctionThisSrc() r
217a0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
217b0 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53  t SrcCount {.  S
217c0 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
217d0 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61  /* One particula
217e0 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  r FROM clause in
217f0 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79 20   a nested query 
21800 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20  */.  int nThis; 
21810 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21820 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
21830 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63   columns in pSrc
21840 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  List */.  int nO
21850 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75  ther;      /* Nu
21860 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
21870 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
21880 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
21890 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ses */.};../*.**
218a0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
218b0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
218c0 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73  to columns..*/.s
218d0 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 72  tatic int exprSr
218e0 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70  cCount(Walker *p
218f0 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
21900 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e  xpr){.  /* The N
21910 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65  EVER() on the se
21920 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63  cond term is bec
21930 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63  ause sqlite3Func
21940 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
21950 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  ).  ** is always
21960 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73   called before s
21970 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
21980 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61 6e  eAggregates() an
21990 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b  d so the.  ** TK
219a0 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f  _COLUMNs have no
219b0 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65  t yet been conve
219c0 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47  rted into TK_AGG
219d0 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a  _COLUMN.  If.  *
219e0 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
219f0 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20 69  nUsesThisSrc() i
21a00 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e 74  s used different
21a10 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  ly in the future
21a20 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52  , the.  ** NEVER
21a30 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  () will need to 
21a40 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20  be removed. */. 
21a50 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
21a60 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56  TK_COLUMN || NEV
21a70 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  ER(pExpr->op==TK
21a80 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a  _AGG_COLUMN) ){.
21a90 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
21aa0 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a  truct SrcCount *
21ab0 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
21ac0 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72  SrcCount;.    Sr
21ad0 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
21ae0 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69  >pSrc;.    for(i
21af0 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
21b00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
21b10 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
21b20 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  =pSrc->a[i].iCur
21b30 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
21b40 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 53 72   }.    if( i<pSr
21b50 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  c->nSrc ){.     
21b60 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20   p->nThis++;.   
21b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
21b80 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d  >nOther++;.    }
21b90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
21ba0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
21bb0 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
21bc0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67  f any of the arg
21bd0 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45  uments to the pE
21be0 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66  xpr Function ref
21bf0 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69  erence.** pSrcLi
21c00 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  st.  Return true
21c10 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c   if they do.  Al
21c20 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  so return true i
21c30 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  f the function.*
21c40 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e  * has no argumen
21c50 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63  ts or has only c
21c60 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
21c70 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  s.  Return false
21c80 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66   if pExpr.** ref
21c90 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20  erences columns 
21ca0 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20  but not columns 
21cb0 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20  of tables found 
21cc0 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  in pSrcList..*/.
21cd0 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74  int sqlite3Funct
21ce0 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45  ionUsesThisSrc(E
21cf0 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c  xpr *pExpr, SrcL
21d00 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a  ist *pSrcList){.
21d10 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
21d20 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e  ruct SrcCount cn
21d30 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  t;.  assert( pEx
21d40 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
21d50 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d  UNCTION );.  mem
21d60 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
21d70 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
21d80 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53  Callback = exprS
21d90 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70  rcCount;.  w.u.p
21da0 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b  SrcCount = &cnt;
21db0 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53  .  cnt.pSrc = pS
21dc0 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54  rcList;.  cnt.nT
21dd0 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e  his = 0;.  cnt.n
21de0 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c  Other = 0;.  sql
21df0 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
21e00 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (&w, pExpr->x.pL
21e10 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  ist);.  return c
21e20 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e  nt.nThis>0 || cn
21e30 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a  t.nOther==0;.}..
21e40 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
21e50 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
21e60 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
21e70 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
21e80 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
21e90 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
21ea0 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
21eb0 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
21ec0 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
21ed0 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
21ee0 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  nfoColumn(sqlite
21ef0 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
21f00 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
21f10 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d  .  pInfo->aCol =
21f20 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
21f30 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
21f40 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ,.       pInfo->
21f50 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
21f60 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
21f70 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
21f80 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20  fo->nColumn,.   
21f90 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
21fa0 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
21fb0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
21fc0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
21fd0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
21fe0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
21ff0 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
22000 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
22010 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
22020 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
22030 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
22040 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
22050 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20  nfoFunc(sqlite3 
22060 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
22070 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
22080 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20   pInfo->aFunc = 
22090 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
220a0 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
220b0 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   .       pInfo->
220c0 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69  aFunc,.       si
220d0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e  zeof(pInfo->aFun
220e0 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70  c[0]),.       &p
220f0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20  Info->nFunc,.   
22100 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
22110 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
22120 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
22130 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66   xExprCallback f
22140 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72  or a tree walker
22150 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f  .  It is used to
22160 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71  .** implement sq
22170 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
22180 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53  Aggregates().  S
22190 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ee sqlite3ExprAn
221a0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a  alyzeAggregates.
221b0 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
221c0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
221d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  /.static int ana
221e0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57 61  lyzeAggregate(Wa
221f0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
22200 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
22210 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
22220 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b  ext *pNC = pWalk
22230 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72  er->u.pNC;.  Par
22240 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
22250 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c  ->pParse;.  SrcL
22260 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
22270 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
22280 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
22290 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e  fo = pNC->pAggIn
222a0 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  fo;..  switch( p
222b0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
222c0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
222d0 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
222e0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
222f0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
22300 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
22310 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
22320 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
22330 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
22340 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
22350 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  see if the colum
22360 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  n is in one of t
22370 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
22380 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63   FROM.      ** c
22390 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
223a0 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
223b0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
223c0 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b  (pSrcList!=0) ){
223d0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
223e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
223f0 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e  tem = pSrcList->
22400 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  a;.        for(i
22410 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
22420 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
22430 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
22440 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
22450 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20  l *pCol;.       
22460 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
22470 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
22480 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
22490 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
224a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
224b0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
224c0 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
224d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
224e0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
224f0 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
22500 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
22510 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
22520 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
22530 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
22540 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
22550 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
22560 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
22570 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
22580 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
22590 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
225a0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
225b0 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
225c0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
225d0 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
225e0 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
225f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
22600 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
22610 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e     pCol = pAggIn
22620 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  fo->aCol;.      
22630 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
22640 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
22650 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  mn; k++, pCol++)
22660 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22670 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  if( pCol->iTable
22680 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
22690 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
226a0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
226b0 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
226c0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
226d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
226e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
226f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22700 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70         if( (k>=p
22710 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
22720 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
22730 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66  & (k = addAggInf
22740 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e  oColumn(pParse->
22750 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d  db, pAggInfo))>=
22760 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  0 .            )
22770 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22780 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
22790 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20  ->aCol[k];.     
227a0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
227b0 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
227c0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
227d0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
227e0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22800 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
22810 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
22820 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
22830 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
22840 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
22850 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
22860 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
22880 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
22890 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
228a0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
228b0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
228c0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
228d0 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
228e0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
228f0 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
22900 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
22910 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
22920 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
22930 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
22950 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
22970 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
22980 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
229a0 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
229b0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
229c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
229d0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
229e0 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
229f0 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a10 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
22a20 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
22a30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22a40 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
22a50 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
22a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22a70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
22a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22aa0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
22ab0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
22ac0 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
22ad0 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22af0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
22b00 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
22b10 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
22b30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22b40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
22b50 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
22b60 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
22b70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
22b80 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
22b90 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
22ba0 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
22bb0 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
22bc0 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
22bd0 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
22be0 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
22bf0 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
22c00 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
22c10 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
22c20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
22c30 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
22c40 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
22c50 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
22c60 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
22c70 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
22c80 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  uce);.          
22c90 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
22ca0 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
22cb0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
22cc0 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c  >op = TK_AGG_COL
22cd0 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UMN;.           
22ce0 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
22cf0 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20  i16)k;.         
22d00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22d10 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
22d20 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
22d30 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
22d40 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
22d50 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
22d60 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
22d70 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
22d80 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
22d90 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
22da0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  CTION: {.      i
22db0 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
22dc0 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29   & NC_InAggFunc)
22dd0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57  ==0.       && pW
22de0 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
22df0 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20  th==pExpr->op2. 
22e00 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
22e10 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
22e20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
22e30 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
22e40 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
22e50 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
22e60 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
22e70 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
22e80 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
22e90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
22ea0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
22eb0 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
22ec0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
22ed0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
22ee0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
22ef0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
22f00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
22f10 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
22f20 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70  (pItem->pExpr, p
22f30 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  Expr, -1)==0 ){.
22f40 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
22f50 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
22f60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22f70 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
22f80 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
22f90 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
22fa0 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
22fb0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
22fc0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
22fd0 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
22fe0 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
22ff0 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
23000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
23010 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
23020 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
23030 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
23040 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
23050 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
23060 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
23070 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
23080 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
23090 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
230a0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
230b0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
230c0 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
230d0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
230e0 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b   pItem->iMem = +
230f0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
23100 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
23110 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
23120 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
23130 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
23140 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
23150 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
23160 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
23170 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
23180 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
23190 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65  u.zToken, sqlite
231a0 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d  3Strlen30(pExpr-
231b0 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20  >u.zToken),.    
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
231d0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20  Expr->x.pList ? 
231e0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
231f0 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
23200 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
23210 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
23220 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29   & EP_Distinct )
23230 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23240 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
23250 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
23260 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
23270 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23280 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
23290 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
232a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
232b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
232c0 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70         /* Make p
232d0 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68  Expr point to th
232e0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41  e appropriate pA
232f0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
23300 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f  entry.        */
23310 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
23320 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
23330 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
23340 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
23350 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ) );.        Exp
23360 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
23370 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
23380 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  ce);.        pEx
23390 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
233a0 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
233b0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
233c0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72  gInfo;.        r
233d0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
233e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
233f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
23400 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
23410 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
23420 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
23430 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  ue;.}.static int
23440 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
23450 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65  esInSelect(Walke
23460 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
23470 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
23480 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
23490 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55  (pWalker);.  UNU
234a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53  SED_PARAMETER(pS
234b0 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  elect);.  return
234c0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
234d0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
234e0 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
234f0 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
23500 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
23510 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
23520 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
23530 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
23540 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  to AggInfo objec
23550 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67  t that pNC->pAgg
23560 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  Info.** points t
23570 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  o.  Additional e
23580 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20  ntries are made 
23590 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f  on the AggInfo o
235a0 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65  bject as.** nece
235b0 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
235c0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
235d0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
235e0 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
235f0 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
23600 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
23610 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
23620 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
23630 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
23640 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
23650 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
23660 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
23670 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
23680 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
23690 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
236a0 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
236b0 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
236c0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
236d0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
236e0 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
236f0 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61  u.pNC = pNC;.  a
23700 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
23710 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c  List!=0 );.  sql
23720 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
23730 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
23740 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  * Call sqlite3Ex
23750 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
23760 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20  tes() for every 
23770 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e  expression in an
23780 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
23790 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ist.  Return the
237a0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
237b0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
237c0 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  rror is found, t
237d0 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63  he analysis is c
237e0 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69  ut short..*/.voi
237f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
23800 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
23810 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
23820 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
23830 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
23840 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
23850 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
23860 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
23870 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
23880 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
23890 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
238a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
238b0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
238c0 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
238d0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
238e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
238f0 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e  ocate a single n
23900 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ew register for 
23910 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65  use to hold some
23920 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
23930 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sult..*/.int sql
23940 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50  ite3GetTempReg(P
23950 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
23960 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
23970 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  mpReg==0 ){.    
23980 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d  return ++pParse-
23990 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74  >nMem;.  }.  ret
239a0 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  urn pParse->aTem
239b0 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e  pReg[--pParse->n
239c0 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a  TempReg];.}../*.
239d0 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
239e0 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67  register, making
239f0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72   available for r
23a00 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  euse for some ot
23a10 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a  her.** purpose..
23a20 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
23a30 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
23a40 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74   being used by t
23a50 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c  he column cache,
23a60 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 6c   then.** the dal
23a70 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65  location is defe
23a80 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63  rred until the c
23a90 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65  olumn cache line
23aa0 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68   that uses.** th
23ab0 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d  e register becom
23ac0 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69  es stale..*/.voi
23ad0 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
23ae0 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
23af0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
23b00 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
23b10 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
23b20 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
23b30 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
23b40 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
23b50 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
23b60 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  *p;.    for(i=0,
23b70 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
23b80 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
23b90 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
23ba0 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
23bb0 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
23bc0 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  .        p->temp
23bd0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Reg = 1;.       
23be0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
23bf0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
23c00 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
23c10 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
23c20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
23c30 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
23c40 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
23c50 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
23c60 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
23c70 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s.*/.int sqlite3
23c80 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72  GetTempRange(Par
23c90 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
23ca0 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nReg){.  int i, 
23cb0 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  n;.  i = pParse-
23cc0 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
23cd0 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
23ce0 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
23cf0 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =n ){.    assert
23d00 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  ( !usedAsColumnC
23d10 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20  ache(pParse, i, 
23d20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50  i+n-1) );.    pP
23d30 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
23d40 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61  += nReg;.    pPa
23d50 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d  rse->nRangeReg -
23d60 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  = nReg;.  }else{
23d70 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d  .    i = pParse-
23d80 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
23d90 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
23da0 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
23db0 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  i;.}.void sqlite
23dc0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
23dd0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
23de0 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
23df0 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 45  Reg){.  sqlite3E
23e00 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
23e10 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65  Parse, iReg, nRe
23e20 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70  g);.  if( nReg>p
23e30 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
23e40 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
23e50 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67  nRangeReg = nReg
23e60 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
23e70 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a  angeReg = iReg;.
23e80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
23e90 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  k all temporary 
23ea0 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69  registers as bei
23eb0 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66  ng unavailable f
23ec0 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69  or reuse..*/.voi
23ed0 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65  d sqlite3ClearTe
23ee0 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65  mpRegCache(Parse
23ef0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
23f00 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20  rse->nTempReg = 
23f10 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  0;.  pParse->nRa
23f20 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a        ngeReg = 0;.}.