/ Hex Artifact Content
Login

Artifact 1f7fa7ddbdffd89898a3ce5ff1e57d137ec87aa5:


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 0a 2a 2a 20 41 6e 20 65  able..**.** An e
c0c0: 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d  xisting b-tree m
c0d0: 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20  ight be used if 
c0e0: 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69  the RHS expressi
c0f0: 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c  on pX is a simpl
c100: 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75  e.** subquery su
c110: 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ch as:.**.**    
c120: 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e   SELECT <column>
c130: 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a   FROM <table>.**
c140: 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f  .** If the RHS o
c150: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
c160: 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61  r is a list or a
c170: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75   more complex su
c180: 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20  bquery, then.** 
c190: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
c1a0: 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  le might need to
c1b0: 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72   be generated fr
c1c0: 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74  om the RHS and t
c1d0: 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c  hen.** pX->iTabl
c1e0: 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
c1f0: 74 6f 20 74 68 65 20 65 70 68 65 72 6d 65 72 61  to the ephermera
c200: 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  l table instead 
c210: 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  of an.** existin
c220: 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  g table..**.** T
c230: 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d  he inFlags param
c240: 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69  eter must contai
c250: 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  n exactly one of
c260: 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f   the bits.** IN_
c270: 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
c280: 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f   or IN_INDEX_LOO
c290: 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63  P.  If inFlags c
c2a0: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e  ontains.** IN_IN
c2b0: 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20  DEX_MEMBERSHIP, 
c2c0: 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74  then the generat
c2d0: 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  ed table will be
c2e0: 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66   used for a.** f
c2f0: 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  ast membership t
c300: 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49  est.  When the I
c310: 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74  N_INDEX_LOOP bit
c320: 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20   is set, the.** 
c330: 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65  IN index will be
c340: 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76   used to loop ov
c350: 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
c360: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a   the RHS of the.
c370: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  ** IN operator..
c380: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
c390: 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64  DEX_LOOP is used
c3a0: 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65   (and the b-tree
c3b0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
c3c0: 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f   iterate.** thro
c3d0: 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62  ugh the set memb
c3e0: 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d  ers) then the b-
c3f0: 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f  tree must not co
c400: 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73  ntain duplicates
c410: 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61  ..** An epherema
c420: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  l table must be 
c430: 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20  used unless the 
c440: 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e  selected <column
c450: 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  > is guaranteed.
c460: 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20  ** to be unique 
c470: 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  - either because
c480: 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45   it is an INTEGE
c490: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
c4a0: 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49   it.** has a UNI
c4b0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
c4c0: 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a  r UNIQUE index..
c4d0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
c4e0: 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69  DEX_MEMBERSHIP i
c4f0: 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
c500: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
c510: 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
c520: 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
c530: 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65  tests) then an e
c540: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
c550: 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20  ust .** be used 
c560: 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20  unless <column> 
c570: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
c580: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20  IMARY KEY or an 
c590: 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65  index can .** be
c5a0: 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c   found with <col
c5b0: 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74  umn> as its left
c5c0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  -most column..**
c5d0: 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74  .** When the b-t
c5e0: 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65  ree is being use
c5f0: 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  d for membership
c600: 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c   tests, the call
c610: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
c620: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e  might need to kn
c630: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
c640: 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20 6f  t the RHS side o
c650: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
c660: 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  r.** contains a 
c670: 4e 55 4c 4c 2e 20 20 49 66 20 70 72 4e 6f 74 46  NULL.  If prNotF
c680: 6f 75 6e 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ound is not NULL
c690: 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
c6a0: 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
c6b0: 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
c6c0: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
c6d0: 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
c6e0: 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
c6f0: 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
c700: 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
c710: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
c720: 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e  itten.** to *prN
c730: 6f 74 46 6f 75 6e 64 2e 20 49 66 20 74 68 65 72  otFound. If ther
c740: 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
c750: 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f  hat the (...) co
c760: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c  ntains a.** NULL
c770: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72   value, then *pr
c780: 4e 6f 74 46 6f 75 6e 64 20 69 73 20 6c 65 66 74  NotFound is left
c790: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
c7a0: 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
c7b0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
c7c0: 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74   its location st
c7d0: 6f 72 65 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f  ored in *prNotFo
c7e0: 75 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73  und, then.** its
c7f0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 69   initial value i
c800: 73 20 4e 55 4c 4c 2e 20 20 49 66 20 74 68 65 20  s NULL.  If the 
c810: 28 2e 2e 2e 29 20 64 6f 65 73 20 6e 6f 74 20 72  (...) does not r
c820: 65 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a  emain constant.*
c830: 2a 20 66 6f 72 20 74 68 65 20 64 75 72 61 74 69  * for the durati
c840: 6f 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  on of the query 
c850: 28 69 2e 65 2e 20 74 68 65 20 53 45 4c 45 43 54  (i.e. the SELECT
c860: 20 77 69 74 68 69 6e 20 74 68 65 20 28 2e 2e 2e   within the (...
c870: 29 0a 2a 2a 20 69 73 20 61 20 63 6f 72 72 65 6c  ).** is a correl
c880: 61 74 65 64 20 73 75 62 71 75 65 72 79 29 20 74  ated subquery) t
c890: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
c8a0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 72   the allocated r
c8b0: 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 72 65  egister is.** re
c8c0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68  set to NULL each
c8d0: 20 74 69 6d 65 20 74 68 65 20 73 75 62 71 75 65   time the subque
c8e0: 72 79 20 69 73 20 72 65 72 75 6e 2e 20 54 68 69  ry is rerun. Thi
c8f0: 73 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20  s allows the.** 
c900: 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 76 64  caller to use vd
c910: 62 65 20 63 6f 64 65 20 65 71 75 69 76 61 6c 65  be code equivale
c920: 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nt to the follow
c930: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ing:.**.**   if(
c940: 20 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20   register==NULL 
c950: 29 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75  ){.**     has_nu
c960: 6c 6c 20 3d 20 3c 74 65 73 74 20 69 66 20 64 61  ll = <test if da
c970: 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ta structure con
c980: 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20  tains null>.**  
c990: 20 20 20 72 65 67 69 73 74 65 72 20 3d 20 31 0a     register = 1.
c9a0: 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20  **   }.**.** in 
c9b0: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 72  order to avoid r
c9c0: 75 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65 73 74  unning the <test
c9d0: 20 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75   if data structu
c9e0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c  re contains null
c9f0: 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f  >.** test more o
ca00: 66 74 65 6e 20 74 68 61 6e 20 69 73 20 6e 65 63  ften than is nec
ca10: 65 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  essary..*/.#ifnd
ca20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
ca30: 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
ca40: 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50  te3FindInIndex(P
ca50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
ca60: 70 72 20 2a 70 58 2c 20 75 33 32 20 69 6e 46 6c  pr *pX, u32 inFl
ca70: 61 67 73 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46  ags, int *prNotF
ca80: 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63 74 20  ound){.  Select 
ca90: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cab0: 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20  * SELECT to the 
cac0: 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72  right of IN oper
cad0: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54  ator */.  int eT
cae0: 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74  /* Type of RHS t
cb10: 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a  able. IN_INDEX_*
cb20: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
cb30: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
cb50: 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53  ursor of the RHS
cb60: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
cb70: 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20  mustBeUnique;   
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53    /* True if RHS
cba0: 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20   must be unique 
cbb0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
cbc0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
cbd0: 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69  arse);     /* Vi
cbe0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
cbf0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20  ing coded */..  
cc00: 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
cc10: 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42  TK_IN );.  mustB
cc20: 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61  eUnique = (inFla
cc30: 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  gs & IN_INDEX_LO
cc40: 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 43 68  OP)!=0;..  /* Ch
cc50: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
cc60: 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
cc70: 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  or index can be 
cc80: 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74  used to.  ** sat
cc90: 69 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20  isfy the query. 
cca0: 20 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61   This is prefera
ccb0: 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e  ble to generatin
ccc0: 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70  g a new .  ** ep
ccd0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20  hemeral table.. 
cce0: 20 2a 2f 0a 20 20 70 20 3d 20 28 45 78 70 72 48   */.  p = (ExprH
ccf0: 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
cd00: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70  P_xIsSelect) ? p
cd10: 58 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30  X->x.pSelect : 0
cd20: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
cd30: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29  pParse->nErr==0)
cd40: 20 26 26 20 69 73 43 61 6e 64 69 64 61 74 65 46   && isCandidateF
cd50: 6f 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20  orInOpt(p) ){.  
cd60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
cd70: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
cd80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
cd90: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
cda0: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
cdb0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cdd0: 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20   Table <table>. 
cde0: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  */.    Expr *pEx
cdf0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ce10: 20 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c   Expression <col
ce20: 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20  umn> */.    i16 
ce30: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce50: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
ce60: 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a  olumn <column> *
ce70: 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20 20  /.    i16 iDb;  
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cea0: 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72  Database idx for
ceb0: 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73   pTab */..    as
cec0: 73 65 72 74 28 20 70 20 29 3b 20 20 20 20 20 20  sert( p );      
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20    /* Because of 
cef0: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
cf00: 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73  Opt(p) */.    as
cf10: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
cf20: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
cf30: 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20    /* Because of 
cf40: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
cf50: 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73  Opt(p) */.    as
cf60: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
cf70: 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
cf80: 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20  ; /* Because of 
cf90: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
cfa0: 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73  Opt(p) */.    as
cfb0: 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30  sert( p->pSrc!=0
cfc0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
cfd0: 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20    /* Because of 
cfe0: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
cff0: 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54  Opt(p) */.    pT
d000: 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
d010: 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 70 45 78  0].pTab;.    pEx
d020: 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
d030: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
d040: 69 43 6f 6c 20 3d 20 28 69 31 36 29 70 45 78 70  iCol = (i16)pExp
d050: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a  r->iColumn;.   .
d060: 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f      /* Code an O
d070: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  P_Transaction an
d080: 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66  d OP_TableLock f
d090: 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  or <table>. */. 
d0a0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
d0b0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
d0c0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
d0d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
d0e0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
d0f0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
d100: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
d110: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
d120: 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
d130: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
d140: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
d150: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
d160: 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e  from two places.
d170: 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74   In both cases t
d180: 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68  he vdbe.    ** h
d190: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
d1a0: 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73  allocated. So as
d1b0: 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56  sume sqlite3GetV
d1c0: 64 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a  dbe() is always.
d1d0: 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
d1e0: 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  l here..    */. 
d1f0: 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20     assert(v);.  
d200: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
d210: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
d220: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
d230: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
d240: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d250: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
d260: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
d270: 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
d280: 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
d290: 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49  .      eType = I
d2a0: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a  N_INDEX_ROWID;..
d2b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d2c0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
d2d0: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
d2e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
d2f0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
d300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
d310: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
d320: 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  */..      /* The
d330: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
d340: 6e 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  nce used by the 
d350: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61  comparison. If a
d360: 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20 20  n index is to.  
d370: 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69      ** be used i
d380: 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d  n place of a tem
d390: 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74  p-table, it must
d3a0: 20 62 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f   be ordered acco
d3b0: 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  rding.      ** t
d3c0: 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e  o this collation
d3d0: 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20   sequence.  */. 
d3e0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52       CollSeq *pR
d3f0: 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  eq = sqlite3Bina
d400: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
d410: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65  (pParse, pX->pLe
d420: 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20  ft, pExpr);..   
d430: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
d440: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
d450: 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
d460: 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a  to perform the .
d470: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69        ** compari
d480: 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20  son is the same 
d490: 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  as the affinity 
d4a0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49  of the column. I
d4b0: 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  f.      ** it is
d4c0: 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20   not, it is not 
d4d0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
d4e0: 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  any index..     
d4f0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
d500: 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69  finity_ok = sqli
d510: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
d520: 4f 6b 28 70 58 2c 20 70 54 61 62 2d 3e 61 43 6f  Ok(pX, pTab->aCo
d530: 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79  l[iCol].affinity
d540: 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49  );..      for(pI
d550: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
d560: 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d   pIdx && eType==
d570: 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b  0 && affinity_ok
d580: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
d590: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
d5a0: 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e   (pIdx->aiColumn
d5b0: 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20  [0]==iCol).     
d5c0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69      && sqlite3Fi
d5d0: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
d5e0: 43 28 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43  C(db), pIdx->azC
d5f0: 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71  oll[0], 0)==pReq
d600: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 21 6d  .         && (!m
d610: 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c 20 28  ustBeUnique || (
d620: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31  pIdx->nKeyCol==1
d630: 20 26 26 20 49 73 55 6e 69 71 75 65 49 6e 64 65   && IsUniqueInde
d640: 78 28 70 49 64 78 29 29 29 0a 20 20 20 20 20 20  x(pIdx))).      
d650: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
d660: 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
d670: 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
d680: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
d690: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
d6a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d6b0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
d6c0: 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75   iTab, pIdx->tnu
d6d0: 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
d6e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d6f0: 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
d700: 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
d710: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
d720: 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
d730: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
d740: 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e     assert( IN_IN
d750: 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d  DEX_INDEX_DESC =
d760: 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
d770: 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20  _ASC+1 );.      
d780: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
d790: 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b  NDEX_INDEX_ASC +
d7a0: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
d7b0: 72 5b 30 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20  r[0];..         
d7c0: 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20   if( prNotFound 
d7d0: 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  && !pTab->aCol[i
d7e0: 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a  Col].notNull ){.
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 4e              *prN
d800: 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72  otFound = ++pPar
d810: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
d820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d830: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
d840: 6c 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75  ll, 0, *prNotFou
d850: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nd);.          }
d860: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d870: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d880: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
d890: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d8a0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79  }.  }..  if( eTy
d8b0: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==0 ){.    /* 
d8c0: 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  Could not find a
d8d0: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
d8e0: 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65   or index to use
d8f0: 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72   as the RHS b-tr
d900: 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69  ee..    ** We wi
d910: 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72  ll have to gener
d920: 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
d930: 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65   table to do the
d940: 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   job..    */.   
d950: 20 75 33 32 20 73 61 76 65 64 4e 51 75 65 72 79   u32 savedNQuery
d960: 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
d970: 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69  QueryLoop;.    i
d980: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  nt rMayHaveNull 
d990: 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  = 0;.    eType =
d9a0: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20   IN_INDEX_EPH;. 
d9b0: 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26     if( inFlags &
d9c0: 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29   IN_INDEX_LOOP )
d9d0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
d9e0: 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a  nQueryLoop = 0;.
d9f0: 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c        if( pX->pL
da00: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26  eft->iColumn<0 &
da10: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
da20: 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
da30: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
da40: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
da50: 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a  _ROWID;.      }.
da60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72      }else if( pr
da70: 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20  NotFound ){.    
da80: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
da90: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b  rMayHaveNull = +
daa0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
dab0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dac0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
dad0: 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75  l, 0, rMayHaveNu
dae0: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
daf0: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
db00: 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20  ect(pParse, pX, 
db10: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54  rMayHaveNull, eT
db20: 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
db30: 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65  WID);.    pParse
db40: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73  ->nQueryLoop = s
db50: 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
db60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d    }else{.    pX-
db70: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
db80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79    }.  return eTy
db90: 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  pe;.}.#endif../*
dba0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
dbb0: 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62  e for scalar sub
dbc0: 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20  queries used as 
dbd0: 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65  a subquery expre
dbe0: 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a  ssion, EXISTS,.*
dbf0: 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  * or IN operator
dc00: 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  s.  Examples:.**
dc10: 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20  .**     (SELECT 
dc20: 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20  a FROM b)       
dc30: 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a     -- subquery.*
dc40: 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45  *     EXISTS (SE
dc50: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
dc60: 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75   -- EXISTS subqu
dc70: 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ery.**     x IN 
dc80: 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
dc90: 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
dca0: 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
dcb0: 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
dcc0: 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
dcd0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
dce0: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
dcf0: 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
dd00: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
dd10: 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
dd20: 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65  rameter describe
dd30: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
dd40: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
dd50: 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f  he IN.** operato
dd60: 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a  r or subquery..*
dd70: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
dd80: 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e  r isRowid is non
dd90: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72  -zero, then expr
dda0: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
ddb0: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
ddc0: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
ddd0: 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20  "<rowid> IN (?, 
dde0: 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72  ?, ?)", where <r
ddf0: 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72  owid> is a refer
de00: 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20  ence.** to some 
de10: 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75  integer key colu
de20: 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d  mn of a table B-
de30: 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Tree. In this ca
de40: 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e  se, use an.** in
de50: 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73  tkey B-Tree to s
de60: 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
de70: 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69  IN(...) values i
de80: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
de90: 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20  ual.** (slower) 
dea0: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
deb0: 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a  keys B-Tree..**.
dec0: 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75  ** If rMayHaveNu
ded0: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
dee0: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
def0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  the operation is
df00: 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61   an IN.** (not a
df10: 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
df20: 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  S) and that the 
df30: 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  RHS might contai
df40: 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c  ns NULLs..** All
df50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
df60: 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  es is initialize
df70: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67 69   the register gi
df80: 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e  ven by rMayHaveN
df90: 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20  ull.** to NULL. 
dfa0: 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   Calling routine
dfb0: 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65  s will take care
dfc0: 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69   of changing thi
dfd0: 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61  s register.** va
dfe0: 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20  lue to non-NULL 
dff0: 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55  if the RHS is NU
e000: 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46  LL-free..**.** F
e010: 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45  or a SELECT or E
e020: 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20  XISTS operator, 
e030: 72 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  return the regis
e040: 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ter that holds t
e050: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46  he.** result.  F
e060: 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  or IN operators 
e070: 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
e080: 63 63 75 72 73 2c 20 74 68 65 20 72 65 74 75 72  ccurs, the retur
e090: 6e 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f  n value is 0..*/
e0a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e0b0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
e0c0: 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  t sqlite3CodeSub
e0d0: 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  select(.  Parse 
e0e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
e0f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
e100: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
e110: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
e120: 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c    /* The IN, SEL
e130: 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f  ECT, or EXISTS o
e140: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
e150: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 20   rMayHaveNull,  
e160: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
e170: 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68   that records wh
e180: 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73  ether NULLs exis
e190: 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e  t in RHS */.  in
e1a0: 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20  t isRowid       
e1b0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
e1c0: 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72  , LHS of IN oper
e1d0: 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20  ator is a rowid 
e1e0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73 74  */.){.  int test
e1f0: 41 64 64 72 20 3d 20 2d 31 3b 20 20 20 20 20 20  Addr = -1;      
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74  /* One-time test
e220: 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e   address */.  in
e230: 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20  t rReg = 0;     
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
e260: 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74  r storing result
e270: 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ing */.  Vdbe *v
e280: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e290: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
e2a0: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
e2b0: 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
e2c0: 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
e2d0: 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54  pParse);..  /* T
e2e0: 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65  his code must be
e2f0: 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69   run in its enti
e300: 72 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20  rety every time 
e310: 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
e320: 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66  d.  ** if any of
e330: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
e340: 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  s true:.  **.  *
e350: 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
e360: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
e370: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
e380: 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20  uery.  **    *  
e390: 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
e3a0: 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73  ide is an expres
e3b0: 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
e3c0: 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20  ning variables. 
e3d0: 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65   **    *  We are
e3e0: 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65   inside a trigge
e3f0: 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61  r.  **.  ** If a
e400: 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
e410: 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  are false, then 
e420: 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20  we can run this 
e430: 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20  code just once. 
e440: 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73   ** save the res
e450: 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20  ults, and reuse 
e460: 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20  the same result 
e470: 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  on subsequent in
e480: 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  vocations..  */.
e490: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
e4a0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
e4b0: 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20  _VarSelect) ){. 
e4c0: 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 73 71     testAddr = sq
e4d0: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
e4e0: 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
e4f0: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66  age(v);.  }..#if
e500: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e510: 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70  _EXPLAIN.  if( p
e520: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
e530: 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
e540: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
e550: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
e560: 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55  arse->db, "EXECU
e570: 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52 59  TE %s%s SUBQUERY
e580: 20 25 64 22 2c 20 74 65 73 74 41 64 64 72 3e 3d   %d", testAddr>=
e590: 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44  0?"":"CORRELATED
e5a0: 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70   ",.        pExp
e5b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49  r->op==TK_IN?"LI
e5c0: 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20 70 50  ST":"SCALAR", pP
e5d0: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
e5e0: 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tId.    );.    s
e5f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
e600: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
e610: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
e620: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
e630: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
e640: 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68  #endif..  switch
e650: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
e660: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
e670: 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69  .      char affi
e680: 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  nity;           
e690: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f     /* Affinity o
e6a0: 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  f the LHS of the
e6b0: 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74   IN */.      int
e6c0: 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
e6d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
e6e0: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
e6f0: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
e700: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
e710: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
e720: 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20  ->pLeft; /* the 
e730: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
e740: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
e750: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
e760: 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b  o = 0;      /* K
e770: 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ey information *
e780: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61  /..      if( rMa
e790: 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20  yHaveNull ){.   
e7a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e7b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
e7c0: 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75  l, 0, rMayHaveNu
e7d0: 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ll);.      }..  
e7e0: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
e7f0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
e800: 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20  ty(pLeft);..    
e810: 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
e820: 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
e830: 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
e840: 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
e850: 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
e860: 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
e870: 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
e880: 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c  y.  An ephemeral
e890: 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20   table is .     
e8a0: 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
e8b0: 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64  single-field ind
e8c0: 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e  ex keys represen
e8d0: 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
e8e0: 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
e8f0: 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65  he SELECT or the
e900: 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20   <exprlist>..   
e910: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
e920: 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73  f the 'x' expres
e930: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
e940: 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53   value, or the S
e950: 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a  ELECT....      *
e960: 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  * statement retu
e970: 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c  rns a column val
e980: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66  ue, then the aff
e990: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20  inity of that.  
e9a0: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73      ** column is
e9b0: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74   used to build t
e9c0: 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  he index keys. I
e9d0: 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74  f both 'x' and t
e9e0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45  he.      ** SELE
e9f0: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
ea00: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
ea10: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
ea20: 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20  ty is used.     
ea30: 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f   ** if either co
ea40: 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43  lumn has NUMERIC
ea50: 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69   or INTEGER affi
ea60: 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72  nity. If neither
ea70: 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f  .      ** 'x' no
ea80: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20  r the SELECT... 
ea90: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
eaa0: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
eab0: 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ric affinity.   
eac0: 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20     ** is used.. 
ead0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45       */.      pE
eae0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
eaf0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
eb00: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
eb10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
eb20: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
eb30: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
eb40: 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20   !isRowid);.    
eb50: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52    pKeyInfo = isR
eb60: 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74  owid ? 0 : sqlit
eb70: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
eb80: 50 61 72 73 65 2d 3e 64 62 2c 20 31 2c 20 31 29  Parse->db, 1, 1)
eb90: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  ;..      if( Exp
eba0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
ebb0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
ebc0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
ebd0: 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72  Case 1:     expr
ebe0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
ebf0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
ec00: 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20      ** Generate 
ec10: 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68  code to write th
ec20: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
ec30: 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65   select into the
ec40: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
ec50: 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f     ** table allo
ec60: 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  cated and opened
ec70: 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
ec80: 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  */.        Selec
ec90: 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78  t *pSelect = pEx
eca0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
ecb0: 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73         SelectDes
ecc0: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  t dest;.        
ecd0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
ece0: 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
ecf0: 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20  t( !isRowid );. 
ed00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
ed10: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
ed20: 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78  st, SRT_Set, pEx
ed30: 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
ed40: 20 20 20 20 20 64 65 73 74 2e 61 66 66 53 64 73       dest.affSds
ed50: 74 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79  t = (u8)affinity
ed60: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ed70: 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ( (pExpr->iTable
ed80: 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45  &0x0000FFFF)==pE
ed90: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
eda0: 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e         pSelect->
edb0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
edc0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
edd0: 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
ede0: 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  & SF_Distinct );
edf0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74  .        pSelect
ee00: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
ee10: 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  F_Distinct;.    
ee20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
ee30: 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20  eyInfo==0 ); /* 
ee40: 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e  Caused by OOM in
ee50: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
ee60: 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20  lloc() */.      
ee70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
ee80: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
ee90: 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  ect, &dest) ){. 
eea0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
eeb0: 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
eec0: 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  yInfo);.        
eed0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
eee0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45      }.        pE
eef0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
ef00: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
ef10: 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
ef20: 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69  !=0 ); /* OOM wi
ef30: 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20 61 66  ll cause exit af
ef40: 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ter sqlite3Selec
ef50: 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  t() */.        a
ef60: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
ef70: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
ef80: 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt( pEList->nExp
ef90: 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  r>0 );.        a
efa0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
efb0: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
efc0: 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20  (pKeyInfo) );.  
efd0: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
efe0: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
eff0: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
f000: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
f010: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20  Expr->pLeft,.   
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f050: 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b        pEList->a[
f060: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
f070: 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
f080: 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
f090: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
f0a0: 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65  /* Case 2:     e
f0b0: 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
f0c0: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
f0d0: 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68       ** For each
f0e0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69   expression, bui
f0f0: 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ld an index key 
f100: 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74  from the evaluat
f110: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
f120: 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  ** store it in t
f130: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
f140: 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  le. If <expr> is
f150: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
f160: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  use.        ** t
f170: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  hat columns affi
f180: 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69  nity when buildi
f190: 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  ng index keys. I
f1a0: 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a  f <expr> is not.
f1b0: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c          ** a col
f1c0: 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
f1d0: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20   affinity..     
f1e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
f1f0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
f200: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
f210: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
f220: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
f230: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
f240: 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  em;.        int 
f250: 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20  r1, r2, r3;..   
f260: 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69       if( !affini
f270: 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ty ){.          
f280: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
f290: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
f2a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
f2b0: 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
f2c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f2d0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
f2e0: 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
f2f0: 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fo) );.         
f300: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
f310: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70  [0] = sqlite3Exp
f320: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
f330: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
f340: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
f350: 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
f360: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
f370: 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
f380: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20  . */.        r1 
f390: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
f3a0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
f3b0: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
f3c0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
f3d0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
f3e0: 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74   isRowid ) sqlit
f3f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f400: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b  OP_Null, 0, r2);
f410: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
f420: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
f430: 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
f440: 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
f450: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
f460: 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
f470: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
f480: 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20  nt iValToIns;.. 
f490: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
f4a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f4b0: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
f4c0: 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
f4d0: 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
f4e0: 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
f4f0: 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
f500: 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
f510: 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
f520: 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
f530: 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
f540: 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
f550: 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
f560: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
f570: 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
f580: 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
f590: 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
f5a0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
f5b0: 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64        if( testAd
f5c0: 64 72 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65  dr>=0 && !sqlite
f5d0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
f5e0: 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
f5f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
f600: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74  hangeToNoop(v, t
f610: 65 73 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20  estAddr);.      
f620: 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d        testAddr =
f630: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
f640: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
f650: 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
f660: 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
f670: 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
f680: 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
f690: 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
f6a0: 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  d && sqlite3Expr
f6b0: 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26  IsInteger(pE2, &
f6c0: 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20  iValToIns) ){.  
f6d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f6e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f6f0: 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78  P_InsertInt, pEx
f700: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
f710: 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20  iValToIns);.    
f720: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f730: 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71           r3 = sq
f740: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
f750: 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c  get(pParse, pE2,
f760: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
f770: 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b    if( isRowid ){
f780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
f790: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f7a0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
f7b0: 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f7e0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
f7f0: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
f800: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
f810: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f820: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f830: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
f840: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
f850: 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  r2, r3);.       
f860: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f870: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f880: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
f890: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
f8a0: 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
f8b0: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
f8c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f8d0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
f8e0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c  ange(pParse, r3,
f8f0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
f900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f910: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
f920: 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
f930: 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  ble, r2);.      
f940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f950: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
f960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
f970: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
f980: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
f990: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f9a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f9b0: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
f9c0: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
f9d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f9e0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
f9f0: 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70   addr, (void *)p
fa00: 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
fa10: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
fa20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fa30: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
fa40: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
fa50: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65  K_SELECT:.    de
fa60: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
fa70: 2a 20 49 66 20 74 68 69 73 20 68 61 73 20 74 6f  * If this has to
fa80: 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
fa90: 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
faa0: 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
fab0: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
fac0: 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
fad0: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
fae0: 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
faf0: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
fb00: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
fb10: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20  in iColumn.  If 
fb20: 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54  this is an EXIST
fb30: 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  S, write.      *
fb40: 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28  * an integer 0 (
fb50: 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31  not exists) or 1
fb60: 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61   (exists) into a
fb70: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20   memory cell.   
fb80: 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64     ** and record
fb90: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
fba0: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20  l in iColumn..  
fbb0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c      */.      Sel
fbc0: 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
fbf0: 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
fc00: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
fc10: 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77  /* How to deal w
fc40: 69 74 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c  ith SELECt resul
fc50: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  t */..      test
fc60: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
fc70: 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
fc80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
fc90: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
fca0: 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
fcb0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
fcc0: 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
fcd0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
fce0: 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72   );..      asser
fcf0: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
fd00: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
fd10: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
fd20: 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
fd30: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
fd40: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
fd50: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20  tInit(&dest, 0, 
fd60: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b  ++pParse->nMem);
fd70: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
fd80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
fd90: 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  ){.        dest.
fda0: 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b  eDest = SRT_Mem;
fdb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fdc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fdd0: 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
fde0: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  SDParm);.       
fdf0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fe00: 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
fe10: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
fe20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fe30: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
fe40: 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
fe50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fe60: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
fe70: 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
fe80: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
fe90: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
fea0: 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
feb0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
fec0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
fed0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
fee0: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  pSel->pLimit);. 
fef0: 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
ff00: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
ff10: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45  (pParse, TK_INTE
ff20: 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  GER, 0, 0,.     
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 71               &sq
ff50: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
ff60: 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  ]);.      pSel->
ff70: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
ff80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
ff90: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
ffa0: 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
ffb0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ffc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67      }.      rReg
ffd0: 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
ffe0: 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56  .      ExprSetVV
fff0: 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
10000 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
10010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10020 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73  }.  }..  if( tes
10030 74 41 64 64 72 3e 3d 30 20 29 7b 0a 20 20 20 20  tAddr>=0 ){.    
10040 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10050 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72 29  ere(v, testAddr)
10060 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
10070 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
10080 73 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  se);..  return r
10090 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Reg;.}.#endif /*
100a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
100b0 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  QUERY */..#ifnde
100c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
100d0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
100e0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
100f0 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n IN expression.
10100 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
10110 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
10120 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75        x IN (valu
10130 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a  e, value, ...).*
10140 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61  *.** The left-ha
10150 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73  nd side (LHS) is
10160 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
10170 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74  sion.  The right
10180 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29  -hand side (RHS)
10190 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20  .** is an array 
101a0 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
101b0 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70  values.  The exp
101c0 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
101d0 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a  if the LHS is.**
101e0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
101f0 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
10200 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70  value of the exp
10210 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f  ression is unkno
10220 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20  wn (NULL).** if 
10230 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20  the LHS is NULL 
10240 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  or if the LHS is
10250 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77   not contained w
10260 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e  ithin the RHS an
10270 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e  d the.** RHS con
10280 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
10290 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  e NULL values..*
102a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
102b0 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
102c0 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 64 65   will jump to de
102d0 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65  stIfFalse if the
102e0 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20   LHS is not .** 
102f0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
10300 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75   the RHS.  If du
10310 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61  e to NULLs we ca
10320 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69  nnot determine i
10330 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20  f the LHS.** is 
10340 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
10350 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74   RHS then jump t
10360 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
10370 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
10380 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  tained.** within
10390 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61   the RHS then fa
103a0 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73  ll through..*/.s
103b0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
103c0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
103d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
103e0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
103f0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
10400 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
10410 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
10420 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
10430 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
10440 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
10450 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
10460 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
10470 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
10480 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
10490 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
104a0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
104b0 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
104c0 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
104d0 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
104e0 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
104f0 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
10500 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
10510 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
10520 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
10530 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
10540 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
10550 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74 6f 20  son affinity to 
10560 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  use */.  int eTy
10570 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
10580 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48  * Type of the RH
10590 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20  S */.  int r1;  
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
105b0 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
105c0 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65  gister */.  Vdbe
105d0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
105e0 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75    /* Statement u
105f0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10600 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  n */..  /* Compu
10610 74 65 20 74 68 65 20 52 48 53 2e 20 20 20 41 66  te the RHS.   Af
10620 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 74  ter this step, t
10630 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
10640 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d  rsor.  ** pExpr-
10650 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e  >iTable will con
10660 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
10670 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
10680 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20  e RHS..  */.  v 
10690 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
106a0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
106b0 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20  );       /* OOM 
106c0 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74  detected prior t
106d0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  o this routine *
106e0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
106f0 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49  ent((v, "begin I
10700 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79  N expr"));.  eTy
10710 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
10720 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
10730 70 45 78 70 72 2c 20 49 4e 5f 49 4e 44 45 58 5f  pExpr, IN_INDEX_
10740 4d 45 4d 42 45 52 53 48 49 50 2c 0a 20 20 20 20  MEMBERSHIP,.    
10750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10760 20 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46           destIfF
10770 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
10780 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e   ? 0 : &rRhsHasN
10790 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  ull);..  /* Figu
107a0 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e  re out the affin
107b0 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72  ity to use to cr
107c0 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20  eate a key from 
107d0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
107e0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
107f0 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20  on. affinityStr 
10800 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20  stores a static 
10810 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
10820 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f  for.  ** P4 of O
10830 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20  P_MakeRecord..  
10840 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20 3d 20  */.  affinity = 
10850 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
10860 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a  ty(pExpr);..  /*
10870 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74   Code the LHS, t
10880 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
10890 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
108a0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
108b0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
108c0 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20 73 71  arse);.  r1 = sq
108d0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
108e0 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
108f0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10900 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10910 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   r1);..  /* If t
10920 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20  he LHS is NULL, 
10930 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
10940 69 73 20 65 69 74 68 65 72 20 66 61 6c 73 65 20  is either false 
10950 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e  or NULL dependin
10960 67 0a 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65  g.  ** on whethe
10970 72 20 74 68 65 20 52 48 53 20 69 73 20 65 6d 70  r the RHS is emp
10980 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65  ty or not, respe
10990 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ctively..  */.  
109a0 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  if( destIfNull==
109b0 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
109c0 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66     /* Shortcut f
109d0 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
109e0 73 65 20 77 68 65 72 65 20 74 68 65 20 66 61 6c  se where the fal
109f0 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63  se and NULL outc
10a00 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  omes are.    ** 
10a10 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20  the same. */.   
10a20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10a30 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
10a40 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29   r1, destIfNull)
10a50 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
10a60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10a70 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69  int addr1 = sqli
10a80 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
10a90 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29   OP_NotNull, r1)
10aa0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
10ab0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10ac0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
10ad0 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  ewind, pExpr->iT
10ae0 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
10af0 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  e);.    VdbeCove
10b00 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
10b10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10b20 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
10b30 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  stIfNull);.    s
10b40 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10b50 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
10b60 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  }..  if( eType==
10b70 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29  IN_INDEX_ROWID )
10b80 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
10b90 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69   case, the RHS i
10ba0 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  s the ROWID of t
10bb0 61 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20  able b-tree.    
10bc0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
10bd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
10be0 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64 65  ustBeInt, r1, de
10bf0 73 74 49 66 46 61 6c 73 65 29 3b 20 56 64 62 65  stIfFalse); Vdbe
10c00 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10c10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10c20 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
10c30 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ts, pExpr->iTabl
10c40 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  e, destIfFalse, 
10c50 72 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  r1);.    VdbeCov
10c60 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73  erage(v);.  }els
10c70 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  e{.    /* In thi
10c80 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20  s case, the RHS 
10c90 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  is an index b-tr
10ca0 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ee..    */.    s
10cb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10cc0 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
10cd0 20 72 31 2c 20 31 2c 20 30 2c 20 26 61 66 66 69   r1, 1, 0, &affi
10ce0 6e 69 74 79 2c 20 31 29 3b 0a 0a 20 20 20 20 2f  nity, 1);..    /
10cf0 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d 65 6d  * If the set mem
10d00 62 65 72 73 68 69 70 20 74 65 73 74 20 66 61 69  bership test fai
10d10 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ls, then the res
10d20 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20 20  ult of the .    
10d30 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20  ** "x IN (...)" 
10d40 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20  expression must 
10d50 62 65 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e  be either 0 or N
10d60 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a  ULL. If the set.
10d70 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
10d80 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  no NULL values, 
10d90 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
10da0 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65 74  is 0. If the set
10db0 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   .    ** contain
10dc0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
10dd0 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
10de0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
10df0 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73  e.    ** express
10e00 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c  ion is also NULL
10e10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
10e20 65 72 74 28 20 64 65 73 74 49 66 46 61 6c 73 65  ert( destIfFalse
10e30 21 3d 64 65 73 74 49 66 4e 75 6c 6c 20 7c 7c 20  !=destIfNull || 
10e40 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29  rRhsHasNull==0 )
10e50 3b 0a 20 20 20 20 69 66 28 20 72 52 68 73 48 61  ;.    if( rRhsHa
10e60 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  sNull==0 ){.    
10e70 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
10e80 20 72 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b   runs if it is k
10e90 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20  nown at compile 
10ea0 74 69 6d 65 20 74 68 61 74 20 74 68 65 20 52 48  time that the RH
10eb0 53 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f  S.      ** canno
10ec0 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76  t contain NULL v
10ed0 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70  alues. This happ
10ee0 65 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c  ens as the resul
10ef0 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20  t.      ** of a 
10f00 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
10f10 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74  raint in the dat
10f20 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20  abase schema..  
10f30 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
10f40 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72  Also run this br
10f50 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20  anch if NULL is 
10f60 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41  equivalent to FA
10f70 4c 53 45 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  LSE.      ** for
10f80 20 74 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   this particular
10f90 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
10fa0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
10fb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
10fc0 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
10fd0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10fe0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
10ff0 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  , 1);.      Vdbe
11000 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
11010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
11020 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c   In this branch,
11030 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
11040 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  IN might contain
11050 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20   a NULL and.    
11060 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e 63    ** the presenc
11070 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74  e of a NULL on t
11080 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20 64  he RHS makes a d
11090 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
110a0 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d  .      ** outcom
110b0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
110c0 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 0a 20    int j1, j2;.. 
110d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 68       /* First ch
110e0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
110f0 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e  e LHS is contain
11100 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ed in the RHS.  
11110 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20  If so,.      ** 
11120 74 68 65 6e 20 74 68 65 20 70 72 65 73 65 6e 63  then the presenc
11130 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68  e of NULLs in th
11140 65 20 52 48 53 20 64 6f 65 73 20 6e 6f 74 20 6d  e RHS does not m
11150 61 74 74 65 72 2c 20 73 6f 20 6a 75 6d 70 0a 20  atter, so jump. 
11160 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c       ** over all
11170 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74 68 61   of the code tha
11180 74 20 66 6f 6c 6c 6f 77 73 2e 0a 20 20 20 20 20  t follows..     
11190 20 2a 2f 0a 20 20 20 20 20 20 6a 31 20 3d 20 73   */.      j1 = s
111a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
111b0 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
111c0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
111d0 30 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  0, r1, 1);.     
111e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
111f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 48 65 72 65  ;..      /* Here
11200 20 77 65 20 62 65 67 69 6e 20 67 65 6e 65 72 61   we begin genera
11210 74 69 6e 67 20 63 6f 64 65 20 74 68 61 74 20 72  ting code that r
11220 75 6e 73 20 69 66 20 74 68 65 20 4c 48 53 20 69  uns if the LHS i
11230 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63  s not.      ** c
11240 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
11250 74 68 65 20 52 48 53 2e 20 20 47 65 6e 65 72 61  the RHS.  Genera
11260 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  te additional co
11270 64 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  de that.      **
11280 20 74 65 73 74 73 20 74 68 65 20 52 48 53 20 66   tests the RHS f
11290 6f 72 20 4e 55 4c 4c 73 2e 20 20 49 66 20 74 68  or NULLs.  If th
112a0 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61  e RHS contains a
112b0 20 4e 55 4c 4c 20 74 68 65 6e 0a 20 20 20 20 20   NULL then.     
112c0 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74   ** jump to dest
112d0 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 72  IfNull.  If ther
112e0 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 73 20 69  e are no NULLs i
112f0 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 0a 20  n the RHS then. 
11300 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20       ** jump to 
11310 64 65 73 74 49 66 46 61 6c 73 65 2e 0a 20 20 20  destIfFalse..   
11320 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
11330 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11340 20 4f 50 5f 49 66 2c 20 72 52 68 73 48 61 73 4e   OP_If, rRhsHasN
11350 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  ull, destIfNull)
11360 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
11370 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11380 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11390 5f 49 66 4e 6f 74 2c 20 72 52 68 73 48 61 73 4e  _IfNot, rRhsHasN
113a0 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ull, destIfFalse
113b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
113c0 76 29 3b 0a 20 20 20 20 20 20 6a 32 20 3d 20 73  v);.      j2 = s
113d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
113e0 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
113f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
11400 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  0, rRhsHasNull, 
11410 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
11420 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
11430 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11440 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
11450 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  , 0, rRhsHasNull
11460 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11470 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11480 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
11490 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71  False);.      sq
114a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
114b0 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 20 20  e(v, j2);.      
114c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
114d0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
114e0 20 31 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 29   1, rRhsHasNull)
114f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11500 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11510 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e  Goto, 0, destIfN
11520 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ull);..      /* 
11530 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20 61 74 20  The OP_Found at 
11540 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20  the top of this 
11550 62 72 61 6e 63 68 20 6a 75 6d 70 73 20 68 65 72  branch jumps her
11560 65 20 77 68 65 6e 20 74 72 75 65 2c 20 0a 20 20  e when true, .  
11570 20 20 20 20 2a 2a 20 63 61 75 73 69 6e 67 20 74      ** causing t
11580 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e 20 65 78  he overall IN ex
11590 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
115a0 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f  ion to fall thro
115b0 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ugh..      */.  
115c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
115d0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
115e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
115f0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
11600 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
11610 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
11620 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
11630 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
11640 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b  "end IN expr"));
11650 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
11660 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
11670 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c  Y */../*.** Dupl
11680 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20  icate an 8-byte 
11690 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20  value.*/.static 
116a0 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73 28  char *dup8bytes(
116b0 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
116c0 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  har *in){.  char
116d0 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44   *out = sqlite3D
116e0 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74  bMallocRaw(sqlit
116f0 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b  e3VdbeDb(v), 8);
11700 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20  .  if( out ){.  
11710 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e    memcpy(out, in
11720 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 8);.  }.  retu
11730 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64  rn out;.}..#ifnd
11740 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
11750 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
11760 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
11770 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
11780 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
11790 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
117a0 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
117b0 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
117c0 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
117d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
117e0 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
117f0 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
11800 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
11810 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
11820 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
11830 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
11840 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
11850 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
11860 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
11870 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
11880 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11890 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
118a0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
118b0 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
118c0 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
118d0 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
118e0 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
118f0 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56  ue;.    char *zV
11900 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
11910 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c  F(z, &value, sql
11920 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
11930 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
11940 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69     assert( !sqli
11950 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20  te3IsNaN(value) 
11960 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74  ); /* The new At
11970 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  oF never returns
11980 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20   NaN */.    if( 
11990 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c  negateFlag ) val
119a0 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
119b0 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28   zV = dup8bytes(
119c0 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65  v, (char*)&value
119d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
119e0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52  beAddOp4(v, OP_R
119f0 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
11a00 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20   zV, P4_REAL);. 
11a10 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
11a20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
11a30 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
11a40 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e   will put the in
11a50 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62  teger describe b
11a60 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e  y.** text z[0..n
11a70 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
11a80 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78  r iMem..**.** Ex
11a90 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61  pr.u.zToken is a
11aa0 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a  lways UTF8 and z
11ab0 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a  ero-terminated..
11ac0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
11ad0 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65  odeInteger(Parse
11ae0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
11af0 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c  pExpr, int negFl
11b00 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
11b10 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
11b20 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
11b30 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
11b40 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
11b50 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d    int i = pExpr-
11b60 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61  >u.iValue;.    a
11b70 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20  ssert( i>=0 );. 
11b80 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
11b90 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c   i = -i;.    sql
11ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11bb0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
11bc0 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b   iMem);.  }else{
11bd0 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20  .    int c;.    
11be0 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63  i64 value;.    c
11bf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
11c00 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
11c10 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
11c20 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69   );.    c = sqli
11c30 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34  te3DecOrHexToI64
11c40 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20  (z, &value);.   
11c50 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d   if( c==0 || (c=
11c60 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29  =2 && negFlag) )
11c70 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  {.      char *zV
11c80 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46  ;.      if( negF
11c90 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63  lag ){ value = c
11ca0 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  ==2 ? SMALLEST_I
11cb0 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d  NT64 : -value; }
11cc0 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38  .      zV = dup8
11cd0 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
11ce0 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73  &value);.      s
11cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11d00 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
11d10 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34   iMem, 0, zV, P4
11d20 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
11d30 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
11d40 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
11d50 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
11d60 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11d70 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
11d80 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
11d90 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
11da0 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66  ", z);.#else.#if
11db0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11dc0 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20  _HEX_INTEGER.   
11dd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
11de0 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32  trnicmp(z,"0x",2
11df0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11e00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11e10 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74  pParse, "hex lit
11e20 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73  eral too big: %s
11e30 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", z);.      }el
11e40 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
11e50 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  {.        codeRe
11e60 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
11e70 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , iMem);.      }
11e80 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
11e90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  }.}../*.** Clear
11ea0 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a   a cache entry..
11eb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
11ec0 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50  acheEntryClear(P
11ed0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
11ee0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
11ef0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d  p){.  if( p->tem
11f00 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20  pReg ){.    if( 
11f10 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
11f20 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
11f30 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
11f40 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54        pParse->aT
11f50 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
11f60 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e  TempReg++] = p->
11f70 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iReg;.    }.    
11f80 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
11f90 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65    }.}.../*.** Re
11fa0 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  cord in the colu
11fb0 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20  mn cache that a 
11fc0 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d  particular colum
11fd0 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74  n from a.** part
11fe0 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20  icular table is 
11ff0 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74  stored in a part
12000 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e  icular register.
12010 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12020 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50  ExprCacheStore(P
12030 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
12040 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c  t iTab, int iCol
12050 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
12060 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c  nt i;.  int minL
12070 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75  ru;.  int idxLru
12080 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
12090 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65  ache *p;..  asse
120a0 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f  rt( iReg>0 );  /
120b0 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65  * Register numbe
120c0 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f  rs are always po
120d0 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65  sitive */.  asse
120e0 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20  rt( iCol>=-1 && 
120f0 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f  iCol<32768 );  /
12100 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20  * Finite column 
12110 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a  numbers */..  /*
12120 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75   The SQLITE_Colu
12130 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73  mnCache flag dis
12140 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ables the column
12150 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73   cache.  This is
12160 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74   used.  ** for t
12170 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f  esting only - to
12180 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c   verify that SQL
12190 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20  ite always gets 
121a0 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
121b0 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69    ** with and wi
121c0 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e  thout the column
121d0 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69   cache..  */.  i
121e0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
121f0 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  isabled(pParse->
12200 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d  db, SQLITE_Colum
12210 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e  nCache) ) return
12220 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65  ;..  /* First re
12230 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69  place any existi
12240 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20  ng entry..  **. 
12250 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
12260 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e  e way the column
12270 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e   cache is curren
12280 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65  tly used, we are
12290 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a   guaranteed.  **
122a0 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74   that the object
122b0 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65   will never alre
122c0 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e  ady be in cache.
122d0 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75    Verify this gu
122e0 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69  arantee..  */.#i
122f0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66  fndef NDEBUG.  f
12300 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
12310 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
12320 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
12330 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
12340 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67   assert( p->iReg
12350 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65  ==0 || p->iTable
12360 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f  !=iTab || p->iCo
12370 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20  lumn!=iCol );.  
12380 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46  }.#endif..  /* F
12390 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f  ind an empty slo
123a0 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74  t and replace it
123b0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
123c0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
123d0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
123e0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
123f0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
12400 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Reg==0 ){.      
12410 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72  p->iLevel = pPar
12420 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
12430 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65  .      p->iTable
12440 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70   = iTab;.      p
12450 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
12460 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
12470 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d  = iReg;.      p-
12480 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
12490 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
124a0 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
124b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
124c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
124d0 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74  Replace the last
124e0 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a   recently used *
124f0 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37  /.  minLru = 0x7
12500 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72  fffffff;.  idxLr
12510 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  u = -1;.  for(i=
12520 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
12530 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
12540 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
12550 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
12560 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b  p->lru<minLru ){
12570 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20  .      idxLru = 
12580 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20  i;.      minLru 
12590 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a  = p->lru;.    }.
125a0 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53    }.  if( ALWAYS
125b0 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20  (idxLru>=0) ){. 
125c0 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
125d0 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75  aColCache[idxLru
125e0 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c  ];.    p->iLevel
125f0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
12600 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69  eLevel;.    p->i
12610 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
12620 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
12630 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67  Col;.    p->iReg
12640 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e   = iReg;.    p->
12650 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
12660 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
12670 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
12680 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d     return;.  }.}
12690 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
126a0 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73 20   that registers 
126b0 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52  between iReg..iR
126c0 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65  eg+nReg-1 are be
126d0 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
126e0 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72 61  .** Purge the ra
126f0 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
12700 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e   from the column
12710 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20   cache..*/.void 
12720 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12730 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  Remove(Parse *pP
12740 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
12750 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
12760 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 20   i;.  int iLast 
12770 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d 20  = iReg + nReg - 
12780 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  1;.  struct yCol
12790 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
127a0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
127b0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
127c0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
127d0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
127e0 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t r = p->iReg;. 
127f0 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20 26     if( r>=iReg &
12800 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20  & r<=iLast ){.  
12810 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
12820 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
12830 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
12840 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
12850 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74  /*.** Remember t
12860 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d  he current colum
12870 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e  n cache context.
12880 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65    Any new entrie
12890 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64  s added.** added
128a0 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   to the column c
128b0 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
128c0 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64  call are removed
128d0 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72   when the.** cor
128e0 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f  responding pop o
128f0 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
12900 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
12910 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ush(Parse *pPars
12920 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43  e){.  pParse->iC
12930 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66  acheLevel++;.#if
12940 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
12950 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
12960 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
12970 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
12980 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
12990 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70  PUSH to %d\n", p
129a0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
129b0 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  el);.  }.#endif.
129c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
129d0 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20  from the column 
129e0 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65  cache any entrie
129f0 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65  s that were adde
12a00 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74  d since the.** t
12a10 68 65 20 70 72 65 76 69 6f 75 73 20 73 71 6c 69  he previous sqli
12a20 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
12a30 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e 20   operation.  In 
12a40 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73  other words, res
12a50 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61 63 68  tore.** the cach
12a60 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 69  e to the state i
12a70 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72 20 74  t was in prior t
12a80 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 50  he most recent P
12a90 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ush..*/.void sql
12aa0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
12ab0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
12ac0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
12ad0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
12ae0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
12af0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d  e->iCacheLevel>=
12b00 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  1 );.  pParse->i
12b10 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69  CacheLevel--;.#i
12b20 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
12b30 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
12b40 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
12b50 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
12b60 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
12b70 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20  "POP  to %d\n", 
12b80 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
12b90 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
12ba0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
12bb0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
12bc0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
12bd0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
12be0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
12bf0 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50   && p->iLevel>pP
12c00 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
12c10 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  l ){.      cache
12c20 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
12c30 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e, p);.      p->
12c40 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  iReg = 0;.    }.
12c50 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
12c60 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d  n a cached colum
12c70 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b  n is reused, mak
12c80 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20  e sure that its 
12c90 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e  register is.** n
12ca0 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62  o longer availab
12cb0 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67  le as a temp reg
12cc0 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23  ister.  ticket #
12cd0 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65  3879:  that same
12ce0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67  .** register mig
12cf0 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ht be in the cac
12d00 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  he in multiple p
12d10 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72  laces, so be sur
12d20 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d  e to.** get them
12d30 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   all..*/.static 
12d40 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
12d50 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
12d60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12d70 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
12d80 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
12d90 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
12da0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
12db0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
12dc0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
12dd0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
12de0 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
12df0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d   ){.      p->tem
12e00 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
12e10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
12e20 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78  erate code to ex
12e30 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
12e40 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  of the iCol-th c
12e50 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
12e60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12e70 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
12e80 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62  mnOfTable(.  Vdb
12e90 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20  e *v,        /* 
12ea0 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63  The VDBE under c
12eb0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
12ec0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
12ed0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f   /* The table co
12ee0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
12ef0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ue */.  int iTab
12f00 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74  Cur,    /* The t
12f10 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72  able cursor.  Or
12f20 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66   the PK cursor f
12f30 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
12f40 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
12f50 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
12f60 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20  f the column to 
12f70 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74  extract */.  int
12f80 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
12f90 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
12fa0 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69  e into this regi
12fb0 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ster */.){.  if(
12fc0 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d   iCol<0 || iCol=
12fd0 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
12fe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12ff0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
13000 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f  d, iTabCur, regO
13010 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
13020 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
13030 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
13040 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
13050 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  umn;.    int x =
13060 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21   iCol;.    if( !
13070 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
13080 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69  {.      x = sqli
13090 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
130a0 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b  (sqlite3PrimaryK
130b0 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69  eyIndex(pTab), i
130c0 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
130d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
130e0 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72  3(v, op, iTabCur
130f0 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  , x, regOut);.  
13100 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
13110 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
13120 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
13130 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75  Tab, iCol, regOu
13140 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
13150 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13160 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
13170 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
13180 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
13190 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74  able pTab and st
131a0 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
131b0 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74  alue in a regist
131c0 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a  er.  An effort.*
131d0 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f  * is made to sto
131e0 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
131f0 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
13200 69 52 65 67 2c 20 62 75 74 20 74 68 69 73 20 69  iReg, but this i
13210 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74  s.** not guarant
13220 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69  eed.  The locati
13230 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  on of the column
13240 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
13250 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ed..**.** There 
13260 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
13270 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69  cursor to pTab i
13280 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68  n iTable when th
13290 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
132a0 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f   called.  If iCo
132b0 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65  lumn<0 then code
132c0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68   is generated th
132d0 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20  at extracts the 
132e0 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rowid..*/.int sq
132f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
13300 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
13310 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
13320 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
13330 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
13340 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
13350 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
13360 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
13370 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
13380 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
13390 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
133a0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
133b0 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
133c0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
133d0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
133e0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
133f0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
13400 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg,        /* St
13410 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
13420 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
13430 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c         /* P5 val
13440 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e  ue for OP_Column
13450 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
13460 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
13470 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
13480 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
13490 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  ;..  for(i=0, p=
134a0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
134b0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
134c0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
134d0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
134e0 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c  eg>0 && p->iTabl
134f0 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e  e==iTable && p->
13500 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  iColumn==iColumn
13510 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75   ){.      p->lru
13520 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
13530 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  eCnt++;.      sq
13540 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
13550 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65  nRegister(pParse
13560 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20  , p->iReg);.    
13570 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67    return p->iReg
13580 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20  ;.    }.  }  .  
13590 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
135a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
135b0 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
135c0 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c  e(v, pTab, iTabl
135d0 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
135e0 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20  );.  if( p5 ){. 
135f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
13600 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20  angeP5(v, p5);. 
13610 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73   }else{   .    s
13620 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
13630 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61  tore(pParse, iTa
13640 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
13650 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eg);.  }.  retur
13660 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
13670 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d   Clear all colum
13680 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e  n cache entries.
13690 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
136a0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 50  ExprCacheClear(P
136b0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
136c0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
136d0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
136e0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
136f0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
13700 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
13710 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
13720 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
13730 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23  CLEAR\n");.  }.#
13740 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c  endif.  for(i=0,
13750 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
13760 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
13770 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
13780 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
13790 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63  >iReg ){.      c
137a0 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
137b0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
137c0 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20   p->iReg = 0;.  
137d0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
137e0 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
137f0 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74   that an affinit
13800 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63  y change has occ
13810 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a  urred on iCount.
13820 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61  ** registers sta
13830 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72  rting with iStar
13840 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
13850 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
13860 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20  ityChange(Parse 
13870 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74  *pParse, int iSt
13880 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29  art, int iCount)
13890 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
138a0 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
138b0 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e  e, iStart, iCoun
138c0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t);.}../*.** Gen
138d0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  erate code to mo
138e0 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ve content from 
138f0 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
13900 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
13910 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
13920 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20  To+nReg-1. Keep 
13930 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
13940 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a   up-to-date..*/.
13950 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
13960 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a  CodeMove(Parse *
13970 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
13980 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20  m, int iTo, int 
13990 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nReg){.  int i;.
139a0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
139b0 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  he *p;.  assert(
139c0 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67   iFrom>=iTo+nReg
139d0 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d   || iFrom+nReg<=
139e0 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  iTo );.  sqlite3
139f0 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
13a00 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76  e->pVdbe, OP_Mov
13a10 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e  e, iFrom, iTo, n
13a20 52 65 67 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Reg);.  for(i=0,
13a30 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
13a40 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
13a50 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
13a60 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  p++){.    int x 
13a70 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
13a80 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78  f( x>=iFrom && x
13a90 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20  <iFrom+nReg ){. 
13aa0 20 20 20 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20       p->iReg += 
13ab0 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d  iTo-iFrom;.    }
13ac0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
13ad0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
13ae0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
13af0 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
13b00 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
13b10 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69  true if any regi
13b20 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67  ster in the rang
13b30 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e  e iFrom..iTo (in
13b40 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75  clusive).** is u
13b50 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
13b60 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
13b70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13b80 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68  ine is used with
13b90 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20  in assert() and 
13ba0 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
13bb0 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f  s only.** and do
13bc0 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
13bd0 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e   a normal build.
13be0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
13bf0 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
13c00 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13c10 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
13c20 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  To){.  int i;.  
13c30 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
13c40 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
13c50 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
13c60 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
13c70 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
13c80 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d  ++){.    int r =
13c90 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66   p->iReg;.    if
13ca0 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c  ( r>=iFrom && r<
13cb0 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b  =iTo ) return 1;
13cc0 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
13cd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
13ce0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
13cf0 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49  TE_DEBUG || SQLI
13d00 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
13d10 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65   */../*.** Conve
13d20 72 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  rt an expression
13d30 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45   node to a TK_RE
13d40 47 49 53 54 45 52 0a 2a 2f 0a 73 74 61 74 69 63  GISTER.*/.static
13d50 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69   void exprToRegi
13d60 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  ster(Expr *p, in
13d70 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70  t iReg){.  p->op
13d80 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e  2 = p->op;.  p->
13d90 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
13da0 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20  ;.  p->iTable = 
13db0 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61  iReg;.  ExprClea
13dc0 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  rProperty(p, EP_
13dd0 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Skip);.}../*.** 
13de0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
13df0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
13e00 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
13e10 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
13e20 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70  ression.  Attemp
13e30 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  t to store the r
13e40 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
13e50 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20  er "target"..** 
13e60 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
13e70 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74  ter where result
13e80 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  s are stored..**
13e90 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f  .** With this ro
13ea0 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20  utine, there is 
13eb0 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  no guarantee tha
13ec0 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a  t results will.*
13ed0 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  * be stored in t
13ee0 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
13ef0 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72  lt might be stor
13f00 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ed in some other
13f10 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20  .** register if 
13f20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74  it is convenient
13f30 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20   to do so.  The 
13f40 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
13f50 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74  .** must check t
13f60 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
13f70 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75  nd move the resu
13f80 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72  lts to the desir
13f90 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a  ed.** register..
13fa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
13fb0 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72  prCodeTarget(Par
13fc0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
13fd0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
13fe0 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
13ff0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
14000 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65    /* The VM unde
14010 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
14020 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14040 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
14050 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
14060 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
14070 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
14080 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
14090 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20  ster inReg */.  
140a0 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
140b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
140c0 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
140d0 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
140e0 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
140f0 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20  egFree2 = 0;    
14100 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
14110 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
14120 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
14130 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   */.  int r1, r2
14140 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20  , r3, r4;       
14150 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73  /* Various regis
14160 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20  ter numbers */. 
14170 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14180 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68  Parse->db; /* Th
14190 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
141a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
141b0 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20  tempX;          
141c0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
141d0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  y expression nod
141e0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
141f0 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
14200 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
14210 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29   );.  if( v==0 )
14220 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
14230 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
14240 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
14250 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  turn 0;.  }..  i
14260 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
14270 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
14280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
14290 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
142a0 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
142b0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
142c0 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
142d0 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
142e0 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
142f0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
14300 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
14310 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
14320 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
14330 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
14340 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
14350 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
14360 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69   assert( pCol->i
14370 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Mem>0 );.       
14380 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69   inReg = pCol->i
14390 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Mem;.        bre
143a0 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ak;.      }else 
143b0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
143c0 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
143d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
143e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
143f0 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
14400 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c  >sortingIdxPTab,
14410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14430 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
14440 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
14450 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14460 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68    }.      /* Oth
14470 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72  erwise, fall thr
14480 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f  u into the TK_CO
14490 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20  LUMN case */.   
144a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
144b0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
144c0 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d  nt iTab = pExpr-
144d0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69  >iTable;.      i
144e0 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20  f( iTab<0 ){.   
144f0 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
14500 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20  >ckBase>0 ){.   
14510 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
14520 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74  ting CHECK const
14530 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74  raints or insert
14540 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c  ing into partial
14550 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
14560 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
14570 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61  r->iColumn + pPa
14580 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20  rse->ckBase;.   
14590 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
145a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
145b0 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 69         /* Deleti
145c0 6e 67 20 66 72 6f 6d 20 61 20 70 61 72 74 69 61  ng from a partia
145d0 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  l index */.     
145e0 20 20 20 20 20 69 54 61 62 20 3d 20 70 50 61 72       iTab = pPar
145f0 73 65 2d 3e 69 50 61 72 74 49 64 78 54 61 62 3b  se->iPartIdxTab;
14600 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14610 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
14620 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14630 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
14640 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20  , pExpr->pTab,. 
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
14670 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
14680 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
146b0 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72  ->op2);.      br
146c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
146d0 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
146e0 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
146f0 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ger(pParse, pExp
14700 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
14710 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14720 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
14730 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
14740 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
14750 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
14760 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
14770 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
14780 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
14790 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
147a0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
147b0 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
147c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
147d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
147e0 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
147f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
14800 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
14810 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
14820 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
14830 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14840 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74  OP_String8, 0, t
14850 61 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72 2d  arget, 0, pExpr-
14860 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20  >u.zToken, 0);. 
14870 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14880 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
14890 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
148a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
148b0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
148c0 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
148d0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
148e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
148f0 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
14900 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
14910 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
14920 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
14930 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f        char *zBlo
14940 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  b;.      assert(
14950 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
14960 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
14970 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
14980 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
14990 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c  zToken[0]=='x' |
149a0 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  | pExpr->u.zToke
149b0 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20  n[0]=='X' );.   
149c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
149d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27  ->u.zToken[1]=='
149e0 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d  \'' );.      z =
149f0 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65   &pExpr->u.zToke
14a00 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20  n[2];.      n = 
14a10 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
14a20 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73  z) - 1;.      as
14a30 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27  sert( z[n]=='\''
14a40 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20   );.      zBlob 
14a50 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c  = sqlite3HexToBl
14a60 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62  ob(sqlite3VdbeDb
14a70 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  (v), z, n);.    
14a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14a90 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
14aa0 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  n/2, target, 0, 
14ab0 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49  zBlob, P4_DYNAMI
14ac0 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  C);.      break;
14ad0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14ae0 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
14af0 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LE: {.      asse
14b00 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
14b10 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
14b20 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
14b30 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
14b40 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a  >u.zToken!=0 );.
14b50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
14b60 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
14b70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
14b80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14b90 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70  , OP_Variable, p
14ba0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74  Expr->iColumn, t
14bb0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
14bc0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
14bd0 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  n[1]!=0 ){.     
14be0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
14bf0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
14c00 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ?' .            
14c10 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72   || strcmp(pExpr
14c20 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72  ->u.zToken, pPar
14c30 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d  se->azVar[pExpr-
14c40 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20  >iColumn-1])==0 
14c50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14c60 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
14c70 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a  , -1, pParse->az
14c80 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Var[pExpr->iColu
14c90 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43  mn-1], P4_STATIC
14ca0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14cb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14cc0 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
14cd0 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  ER: {.      inRe
14ce0 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  g = pExpr->iTabl
14cf0 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
14d00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14d10 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_AS: {.      in
14d20 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
14d30 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
14d40 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
14d50 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14d60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
14d70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14d80 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
14d90 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
14da0 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
14db0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
14dc0 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
14dd0 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  en) */.      int
14de0 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20   aff, to_op;.   
14df0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
14e00 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
14e10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14e20 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
14e30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
14e40 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14e50 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
14e60 65 29 20 29 3b 0a 20 20 20 20 20 20 61 66 66 20  e) );.      aff 
14e70 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
14e80 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
14e90 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20  Token, 0);.     
14ea0 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53   to_op = aff - S
14eb0 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b  QLITE_AFF_TEXT +
14ec0 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20   OP_ToText;.    
14ed0 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
14ee0 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c  =OP_ToText    ||
14ef0 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
14f00 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20  _TEXT    );.    
14f10 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
14f20 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c  =OP_ToBlob    ||
14f30 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
14f40 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20  _NONE    );.    
14f50 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
14f60 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c  =OP_ToNumeric ||
14f70 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
14f80 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20  _NUMERIC );.    
14f90 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
14fa0 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c  =OP_ToInt     ||
14fb0 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
14fc0 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
14fd0 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
14fe0 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c  =OP_ToReal    ||
14ff0 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
15000 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20  _REAL    );.    
15010 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
15020 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a  p==OP_ToText );.
15030 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15040 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62  to_op==OP_ToBlob
15050 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15060 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
15070 4e 75 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20  Numeric );.     
15080 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
15090 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20  ==OP_ToInt );.  
150a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
150b0 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29  _op==OP_ToReal )
150c0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
150d0 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20  g!=target ){.   
150e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
150f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
15100 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
15110 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  t);.        inRe
15120 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
15130 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
15140 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74  3VdbeAddOp1(v, t
15150 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20  o_op, inReg);.  
15160 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73      testcase( us
15170 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
15180 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69  pParse, inReg, i
15190 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73  nReg) );.      s
151a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
151b0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
151c0 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b  arse, inReg, 1);
151d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
151e0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
151f0 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
15200 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
15210 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
15220 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
15230 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
15240 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
15250 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
15260 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
15270 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
15280 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
15290 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
152a0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
152b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
152c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
152d0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
152e0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
152f0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
15300 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
15310 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
15320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15330 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
15340 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
15350 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  2);.      assert
15360 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
15370 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
15380 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
15390 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
153a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
153b0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
153c0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
153d0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
153e0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
153f0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
15400 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
15410 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
15420 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
15430 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
15440 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
15450 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
15460 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
15470 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
15480 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
15490 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
154a0 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
154b0 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62  (op==OP_Eq); Vdb
154c0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
154d0 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
154e0 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
154f0 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
15500 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
15510 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
15520 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65  OP_Ne);.      te
15530 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
15540 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
15550 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
15560 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
15570 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
15580 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
15590 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20  e TK_ISNOT: {.  
155a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
155b0 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
155c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
155d0 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
155e0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
155f0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
15600 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
15610 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
15620 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
15630 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
15640 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
15650 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
15660 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
15670 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
15680 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65  K_NE;.      code
15690 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
156a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
156b0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
156c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
156d0 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67     r1, r2, inReg
156e0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
156f0 20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   | SQLITE_NULLEQ
15700 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
15710 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
15720 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  K_EQ);.      Vdb
15730 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
15740 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20  p==TK_NE);.     
15750 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
15760 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
15770 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
15780 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
15790 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
157a0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
157b0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
157c0 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
157d0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
157e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
157f0 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
15800 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
15810 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
15820 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
15830 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
15840 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
15850 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
15860 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
15870 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
15880 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41      assert( TK_A
15890 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20  ND==OP_And );   
158a0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
158b0 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  e( op==TK_AND );
158c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
158d0 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20  K_OR==OP_Or );  
158e0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
158f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20  case( op==TK_OR 
15900 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15910 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
15920 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65   );           te
15930 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50  stcase( op==TK_P
15940 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73  LUS );.      ass
15950 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
15960 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20  P_Subtract );   
15970 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15980 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20  TK_MINUS );.    
15990 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d    assert( TK_REM
159a0 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29  ==OP_Remainder )
159b0 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
159c0 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20   op==TK_REM );. 
159d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
159e0 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e  BITAND==OP_BitAn
159f0 64 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  d );      testca
15a00 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e  se( op==TK_BITAN
15a10 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
15a20 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f  t( TK_BITOR==OP_
15a30 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20  BitOr );        
15a40 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15a50 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20  _BITOR );.      
15a60 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48  assert( TK_SLASH
15a70 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20  ==OP_Divide );  
15a80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15a90 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20  p==TK_SLASH );. 
15aa0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15ab0 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  LSHIFT==OP_Shift
15ac0 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61  Left );   testca
15ad0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46  se( op==TK_LSHIF
15ae0 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
15af0 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
15b00 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20  _ShiftRight );  
15b10 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15b20 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _RSHIFT );.     
15b30 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
15b40 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
15b50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15b60 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b  op==TK_CONCAT );
15b70 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
15b80 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15b90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15ba0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
15bb0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
15bc0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
15bd0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15be0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
15bf0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
15c00 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
15c10 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  p, r2, r1, targe
15c20 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
15c30 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
15c40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15c50 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
15c60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15c70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
15c80 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
15c90 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
15ca0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
15cb0 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
15cc0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
15cd0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
15ce0 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63  GER ){.        c
15cf0 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
15d00 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72  e, pLeft, 1, tar
15d10 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  get);.#ifndef SQ
15d20 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
15d30 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d  NG_POINT.      }
15d40 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e  else if( pLeft->
15d50 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a  op==TK_FLOAT ){.
15d60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15d70 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15d80 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
15d90 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
15da0 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66  codeReal(v, pLef
15db0 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20  t->u.zToken, 1, 
15dc0 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a  target);.#endif.
15dd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15de0 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20       tempX.op = 
15df0 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TK_INTEGER;.    
15e00 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20      tempX.flags 
15e10 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  = EP_IntValue|EP
15e20 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20  _TokenOnly;.    
15e30 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c      tempX.u.iVal
15e40 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ue = 0;.        
15e50 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
15e60 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
15e70 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65   &tempX, &regFre
15e80 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  e1);.        r2 
15e90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15ea0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
15eb0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
15ec0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
15ed0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15ee0 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74  3(v, OP_Subtract
15ef0 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
15f00 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
15f10 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
15f20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
15f30 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
15f40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15f50 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
15f60 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
15f70 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
15f80 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
15f90 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
15fa0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
15fb0 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20  ==TK_BITNOT );. 
15fc0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15fd0 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20  NOT==OP_Not );  
15fe0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
15ff0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20   op==TK_NOT );. 
16000 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
16010 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
16020 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
16030 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
16040 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16050 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
16060 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
16070 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  get;.      sqlit
16080 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16090 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a  op, r1, inReg);.
160a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
160b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
160c0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
160d0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
160e0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
160f0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
16100 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
16110 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
16120 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
16130 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
16140 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
16150 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
16160 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
16170 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
16180 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16190 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
161a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31  arget);.      r1
161b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
161c0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
161d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
161e0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
161f0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16200 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  1==0 );.      ad
16210 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
16220 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
16230 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
16240 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
16250 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
16260 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
16270 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
16280 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
16290 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
162a0 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74  P_AddImm, target
162b0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , -1);.      sql
162c0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
162d0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
162e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
162f0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
16300 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
16310 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
16320 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
16330 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
16340 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
16350 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
16360 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
16370 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
16380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
16390 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
163a0 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
163b0 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78  gate: %s()", pEx
163c0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
163d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
163e0 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66      inReg = pInf
163f0 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
16400 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
16410 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
16420 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16430 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
16440 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
16450 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
16460 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
16470 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
16480 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
16490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
164a0 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
164b0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
164c0 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
164d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
164e0 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
164f0 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
16500 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
16510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
16520 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e  ength of the fun
16530 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79  ction name in by
16540 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  tes */.      con
16550 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
16560 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
16570 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
16580 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20    u32 constMask 
16590 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b  = 0;     /* Mask
165a0 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
165b0 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  uments that are 
165c0 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20  constant */.    
165d0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
165e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
165f0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
16600 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
16610 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b);      /* The 
16620 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73  text encoding us
16630 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ed by this datab
16640 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c  ase */.      Col
16650 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
16660 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69      /* A collati
16670 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a  ng sequence */..
16680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
16690 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
166a0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
166b0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
166c0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
166d0 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
166e0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
166f0 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20   pFarg = 0;.    
16700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16710 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e   pFarg = pExpr->
16720 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d  x.pList;.      }
16730 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70  .      nFarg = p
16740 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45  Farg ? pFarg->nE
16750 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61  xpr : 0;.      a
16760 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
16770 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
16780 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
16790 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72       zId = pExpr
167a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
167b0 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53    nId = sqlite3S
167c0 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20  trlen30(zId);.  
167d0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
167e0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
167f0 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 46 61  b, zId, nId, nFa
16800 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20  rg, enc, 0);.   
16810 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
16820 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16830 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16840 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74  , "unknown funct
16850 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e 49  ion: %.*s()", nI
16860 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
16870 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
16880 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70  .      /* Attemp
16890 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65  t a direct imple
168a0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
168b0 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53   built-in COALES
168c0 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  CE() and.      *
168d0 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74  * IFNULL() funct
168e0 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69  ions.  This avoi
168f0 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65  ds unnecessary e
16900 76 61 6c 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20  valation of.    
16910 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70    ** arguments p
16920 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f  ast the first no
16930 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  n-NULL argument.
16940 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16950 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
16960 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
16970 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
16980 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
16990 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
169a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
169b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
169c0 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20   nFarg>=2 );.   
169d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
169e0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
169f0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
16a00 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
16a10 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72   for(i=1; i<nFar
16a20 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
16a30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16a40 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
16a50 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43  ll, target, endC
16a60 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
16a70 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
16a80 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
16a90 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
16aa0 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61  emove(pParse, ta
16ab0 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rget, 1);.      
16ac0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16ad0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
16ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16af0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
16b00 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
16b10 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
16b20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16b30 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
16b40 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  arse);.        }
16b50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16b60 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
16b70 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  (v, endCoalesce)
16b80 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
16b90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
16ba0 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28  /* The UNLIKELY(
16bb0 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  ) function is a 
16bc0 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75  no-op.  The resu
16bd0 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a  lt is the value.
16be0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
16bf0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
16c00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
16c10 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
16c20 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
16c30 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20  _UNLIKELY ){.   
16c40 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
16c50 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg>=1 );.       
16c60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16c70 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
16c80 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
16c90 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
16ca0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
16cb0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
16cc0 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
16cd0 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73     if( i<32 && s
16ce0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
16cf0 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d  tant(pFarg->a[i]
16d00 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
16d10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
16d20 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
16d30 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d    constMask |= M
16d40 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20  ASKBIT32(i);.   
16d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
16d60 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
16d70 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
16d80 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
16d90 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
16da0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
16db0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
16dc0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
16dd0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
16de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16df0 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29       if( pFarg )
16e00 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
16e10 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20  nstMask ){.     
16e20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65       r1 = pParse
16e30 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
16e40 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
16e50 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20   += nFarg;.     
16e60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16e70 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
16e80 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
16e90 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20  rse, nFarg);.   
16ea0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
16eb0 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20  /* For length() 
16ec0 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e  and typeof() fun
16ed0 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f  ctions with a co
16ee0 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20  lumn argument,. 
16ef0 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68         ** set th
16f00 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74  e P5 parameter t
16f10 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  o the OP_Column 
16f20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47  opcode to OPFLAG
16f30 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20  _LENGTHARG.     
16f40 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f     ** or OPFLAG_
16f50 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63  TYPEOFARG respec
16f60 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64  tively, to avoid
16f70 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74   unnecessary dat
16f80 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61  a.        ** loa
16f90 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ding..        */
16fa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
16fb0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
16fc0 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e  (SQLITE_FUNC_LEN
16fd0 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  GTH|SQLITE_FUNC_
16fe0 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20  TYPEOF))!=0 ){. 
16ff0 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72           u8 expr
17000 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  Op;.          as
17010 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
17020 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
17030 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rt( pFarg->a[0].
17040 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
17050 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70        exprOp = p
17060 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
17070 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  ->op;.          
17080 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43  if( exprOp==TK_C
17090 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d  OLUMN || exprOp=
170a0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
170b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
170c0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
170d0 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47  C_LENGTH==OPFLAG
170e0 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
170f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17100 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  ( SQLITE_FUNC_TY
17110 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50  PEOF==OPFLAG_TYP
17120 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20  EOFARG );.      
17130 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17140 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
17150 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  & OPFLAG_LENGTHA
17160 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
17170 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45    pFarg->a[0].pE
17180 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20  xpr->op2 = .    
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
171a0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
171b0 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  (OPFLAG_LENGTHAR
171c0 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  G|OPFLAG_TYPEOFA
171d0 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  RG);.          }
171e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
171f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17200 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
17210 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20  ;     /* Ticket 
17220 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
17230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17240 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
17250 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72  pParse, pFarg, r
17260 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
17290 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  UP|SQLITE_ECEL_F
172a0 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20 20  ACTOR);.        
172b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
172c0 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20 20  Pop(pParse);    
172d0 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32    /* Ticket 2ea2
172e0 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20  425d34be */.    
172f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17300 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   r1 = 0;.      }
17310 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17320 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17330 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69  E.      /* Possi
17340 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65  bly overload the
17350 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65   function if the
17360 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
17370 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69  is.      ** a vi
17380 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75  rtual table colu
17390 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  mn..      **.   
173a0 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20     ** For infix 
173b0 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c  functions (LIKE,
173c0 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61   GLOB, REGEXP, a
173d0 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68  nd MATCH) use th
173e0 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  e.      ** secon
173f0 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20  d argument, not 
17400 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68  the first, as th
17410 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65  e argument to te
17420 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  st to.      ** s
17430 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f  ee if it is a co
17440 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61  lumn in a virtua
17450 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69  l table.  This i
17460 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20  s done because. 
17470 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74       ** the left
17480 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69   operand of infi
17490 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65  x functions (the
174a0 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74   operand we want
174b0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   to.      ** con
174c0 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67  trol overloading
174d0 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65  ) ends up as the
174e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
174f0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
17500 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
17510 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c  expression "A gl
17520 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c  ob B" is equival
17530 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
17540 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65   "glob(B,A).  We
17550 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65   want to use the
17560 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22   A in "A glob B"
17570 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a   to test.      *
17580 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f  * for function o
17590 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74  verloading.  But
175a0 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65   we use the B te
175b0 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29  rm in "glob(B,A)
175c0 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
175d0 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26    if( nFarg>=2 &
175e0 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  & (pExpr->flags 
175f0 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20  & EP_InfixFunc) 
17600 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
17610 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
17620 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
17630 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
17640 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  Farg->a[1].pExpr
17650 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
17660 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20  f( nFarg>0 ){.  
17670 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
17680 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
17690 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
176a0 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
176b0 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
176c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
176d0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
176e0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
176f0 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
17700 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
17710 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
17720 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20  ->pDfltColl; .  
17730 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17740 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
17750 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20  llSeq, 0, 0, 0, 
17760 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
17770 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
17780 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
17790 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
177a0 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73  P_Function, cons
177b0 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65  tMask, r1, targe
177c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
177d0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
177e0 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44  *)pDef, P4_FUNCD
177f0 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EF);.      sqlit
17800 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
17810 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20  , (u8)nFarg);.  
17820 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 26 26      if( nFarg &&
17830 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b   constMask==0 ){
17840 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17850 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
17860 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61  (pParse, r1, nFa
17870 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
17880 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17890 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
178a0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
178b0 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
178c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
178d0 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  ECT: {.      tes
178e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58  tcase( op==TK_EX
178f0 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
17900 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
17910 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69  ELECT );.      i
17920 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f  nReg = sqlite3Co
17930 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
17940 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
17950 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17960 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
17970 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
17980 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
17990 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
179a0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
179b0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
179c0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
179d0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
179e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
179f0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
17a00 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
17a10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
17a20 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
17a30 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
17a40 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
17a50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17a60 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
17a70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
17a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17a90 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
17aa0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
17ab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17ac0 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
17ad0 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20   target, 0);.   
17ae0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17af0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
17b00 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
17b10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
17b20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
17b30 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
17b40 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
17b50 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
17b60 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
17b70 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
17b80 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
17b90 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
17ba0 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
17bb0 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
17bc0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
17bd0 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
17be0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
17bf0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
17c00 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
17c10 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
17c20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
17c30 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
17c40 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
17c50 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
17c60 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
17c70 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  t;.      struct 
17c80 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
17c90 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78  LItem = pExpr->x
17ca0 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  .pList->a;.     
17cb0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
17cc0 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a  pLItem->pExpr;..
17cd0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
17ce0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
17cf0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72  Parse, pLeft, &r
17d00 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
17d10 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
17d20 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
17d30 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65   pRight, &regFre
17d40 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e2);.      testc
17d50 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
17d60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17d70 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
17d80 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73 71  );.      r3 = sq
17d90 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
17da0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72  pParse);.      r
17db0 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  4 = sqlite3GetTe
17dc0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
17dd0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
17de0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
17df0 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20  pRight, OP_Ge,. 
17e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e10 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c   r1, r2, r3, SQL
17e20 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 20 20 56  ITE_STOREP2);  V
17e30 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17e40 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a        pLItem++;.
17e50 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
17e60 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  LItem->pExpr;.  
17e70 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17e80 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17e90 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20  , regFree2);.   
17ea0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
17eb0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17ec0 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67  se, pRight, &reg
17ed0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65  Free2);.      te
17ee0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
17ef0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==0 );.      cod
17f00 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
17f10 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
17f20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72  OP_Le, r1, r2, r
17f30 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  4, SQLITE_STOREP
17f40 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
17f50 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17f60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17f70 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33  p3(v, OP_And, r3
17f80 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r4, target);. 
17f90 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
17fa0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17fb0 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71  e, r3);.      sq
17fc0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
17fd0 52 65 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b  Reg(pParse, r4);
17fe0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17ff0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
18000 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61  COLLATE: .    ca
18010 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
18020 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
18030 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
18040 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
18050 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
18060 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18070 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
18080 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20  K_TRIGGER: {.   
18090 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63     /* If the opc
180a0 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45  ode is TK_TRIGGE
180b0 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  R, then the expr
180c0 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65  ession is a refe
180d0 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74  rence.      ** t
180e0 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  o a column in th
180f0 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a  e new.* or old.*
18100 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61   pseudo-tables a
18110 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20  vailable to.    
18120 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f    ** trigger pro
18130 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63  grams. In this c
18140 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20  ase Expr.iTable 
18150 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20  is set to 1 for 
18160 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77  the.      ** new
18170 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
18180 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c   or 0 for the ol
18190 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
181a0 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20  . Expr.iColumn. 
181b0 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
181c0 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  o the column of 
181d0 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  the pseudo-table
181e0 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20   to read, or to 
181f0 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  -1 to.      ** r
18200 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69  ead the rowid fi
18210 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eld..      **.  
18220 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65      ** The expre
18230 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ssion is impleme
18240 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50  nted using an OP
18250 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54  _Param opcode. T
18260 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70  he p1.      ** p
18270 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20  arameter is set 
18280 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e  to 0 for an old.
18290 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
182a0 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20   or to (i+1).   
182b0 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e     ** to referen
182c0 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d  ce another colum
182d0 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70  n of the old.* p
182e0 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65  seudo-table, whe
182f0 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69  re .      ** i i
18300 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
18310 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61  he column. For a
18320 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72   new.rowid refer
18330 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20  ence, p1 is.    
18340 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31    ** set to (n+1
18350 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68  ), where n is th
18360 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
18370 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75  mns in each pseu
18380 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  do-table..      
18390 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e  ** For a referen
183a0 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20  ce to any other 
183b0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
183c0 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
183d0 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73  , p1.      ** is
183e0 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c   set to (n+2+i),
183f0 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61   where n and i a
18400 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72  re as defined pr
18410 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20  eviously. For.  
18420 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20      ** example, 
18430 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  if the table on 
18440 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61  which triggers a
18450 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69  re being fired i
18460 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61  s.      ** decla
18470 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a  red as:.      **
18480 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41  .      **   CREA
18490 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
184a0 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  );.      **.    
184b0 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20    ** Then p1 is 
184c0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
184d0 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a  ollows:.      **
184e0 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
184f0 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f  0   ->    old.ro
18500 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20  wid     p1==3   
18510 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a  ->    new.rowid.
18520 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31        **   p1==1
18530 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20     ->    old.a  
18540 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d         p1==4   -
18550 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20  >    new.a.     
18560 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e   **   p1==2   ->
18570 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20      old.b       
18580 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20    p1==5   ->    
18590 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20  new.b       .   
185a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
185b0 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d  e *pTab = pExpr-
185c0 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  >pTab;.      int
185d0 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61   p1 = pExpr->iTa
185e0 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f  ble * (pTab->nCo
185f0 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72  l+1) + 1 + pExpr
18600 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20  ->iColumn;..    
18610 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
18620 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45  >iTable==0 || pE
18630 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29  xpr->iTable==1 )
18640 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18650 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
18660 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  -1 && pExpr->iCo
18670 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  lumn<pTab->nCol 
18680 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18690 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c   pTab->iPKey<0 |
186a0 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  | pExpr->iColumn
186b0 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b  !=pTab->iPKey );
186c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
186d0 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62  1>=0 && p1<(pTab
186e0 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a  ->nCol*2+2) );..
186f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18700 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61  eAddOp2(v, OP_Pa
18710 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29  ram, p1, target)
18720 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
18730 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d  ent((v, "%s.%s -
18740 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20  > $%d",.        
18750 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f  (pExpr->iTable ?
18760 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c   "new" : "old"),
18770 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
18780 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f  >iColumn<0 ? "ro
18790 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54  wid" : pExpr->pT
187a0 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
187b0 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c  iColumn].zName),
187c0 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a  .        target.
187d0 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64        ));..#ifnd
187e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
187f0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
18800 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
18810 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66  lumn has REAL af
18820 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63  finity, it may c
18830 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
18840 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a  ed as an.      *
18850 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f  * integer. Use O
18860 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74  P_RealAffinity t
18870 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
18880 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 20 20  s really real.  
18890 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  */.      if( pEx
188a0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a  pr->iColumn>=0 .
188b0 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e         && pTab->
188c0 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
188d0 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53  umn].affinity==S
188e0 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20  QLITE_AFF_REAL. 
188f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
18900 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18910 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
18920 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20  nity, target);. 
18930 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
18940 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18950 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
18960 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
18970 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
18980 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
18990 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
189a0 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
189b0 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
189c0 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
189d0 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
189e0 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
189f0 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
18a00 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
18a10 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
18a20 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
18a30 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
18a40 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
18a50 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
18a60 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
18a70 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
18a80 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
18a90 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
18aa0 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
18ab0 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
18ac0 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
18ad0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
18ae0 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
18af0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
18b00 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
18b10 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
18b20 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   of pExpr->x.pLi
18b30 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70  st if pExpr->x.p
18b40 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20  List->nExpr is. 
18b50 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20     ** odd.  The 
18b60 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
18b70 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62  al.  If the numb
18b80 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
18b90 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a  n x.pList.    **
18ba0 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59   is even, then Y
18bb0 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
18bc0 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20  the "otherwise" 
18bd0 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
18be0 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20      ** Ei is in 
18bf0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
18c00 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70  i*2] and Ri is p
18c10 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
18c20 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20  *2+1]..    **.  
18c30 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20    ** The result 
18c40 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
18c50 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20  n is the Ri for 
18c60 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
18c70 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72  ng Ei,.    ** or
18c80 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
18c90 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65  matching Ei, the
18ca0 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72   ELSE term Y, or
18cb0 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   if there is.   
18cc0 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d   ** no ELSE term
18cd0 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  , NULL..    */. 
18ce0 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
18cf0 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20  rt( op==TK_CASE 
18d00 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ); {.      int e
18d10 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  ndLabel;        
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18d30 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65  GOTO label for e
18d40 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20  nd of CASE stmt 
18d50 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  */.      int nex
18d60 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  tCase;          
18d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
18d80 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78  TO label for nex
18d90 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  t WHEN clause */
18da0 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
18db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e           /* 2x n
18dd0 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65  umber of WHEN te
18de0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
18df0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18e10 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
18e20 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
18e30 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
18e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
18e50 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  t of WHEN terms 
18e60 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
18e70 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
18e80 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72  Listelem;  /* Ar
18e90 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ray of WHEN term
18ea0 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
18eb0 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20  opCompare;      
18ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18ed0 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73  The X==Ei expres
18ee0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
18ef0 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
18f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f10 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73  /* The X express
18f20 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
18f30 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20  r *pTest = 0;   
18f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18f50 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29  * X==Ei (form A)
18f60 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72   or just Ei (for
18f70 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56  m B) */.      VV
18f80 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63  A_ONLY( int iCac
18f90 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  heLevel = pParse
18fa0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29  ->iCacheLevel; )
18fb0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
18fc0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
18fd0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
18fe0 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
18ff0 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
19000 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
19010 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
19020 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
19030 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
19040 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
19050 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
19060 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
19070 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
19080 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
19090 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
190a0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
190b0 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
190c0 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
190d0 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a     tempX = *pX;.
190e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
190f0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
19100 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65  UMN );.        e
19110 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74  xprToRegister(&t
19120 65 6d 70 58 2c 20 73 71 6c 69 74 65 33 45 78 70  empX, sqlite3Exp
19130 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
19140 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  , pX, &regFree1)
19150 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
19160 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
19170 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f   );.        opCo
19180 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51  mpare.op = TK_EQ
19190 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
191a0 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d  are.pLeft = &tem
191b0 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73  pX;.        pTes
191c0 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a  t = &opCompare;.
191d0 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65          /* Ticke
191e0 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66  t b351d95f9cd5ef
191f0 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61  17e9d9dbae18f5ca
19200 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20  8611190001:.    
19210 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65      ** The value
19220 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67   in regFree1 mig
19230 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20  ht get SCopy-ed 
19240 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65  into the file re
19250 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  sult..        **
19260 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   So make sure th
19270 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20  at the regFree1 
19280 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20  register is not 
19290 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72  reused for other
192a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70  .        ** purp
192b0 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c  oses and possibl
192c0 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  y overwritten.  
192d0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  */.        regFr
192e0 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ee1 = 0;.      }
192f0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
19300 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32  i<nExpr-1; i=i+2
19310 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19320 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
19330 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
19340 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20   if( pX ){.     
19350 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
19360 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
19370 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
19380 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
19390 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
193a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
193b0 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
193c0 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
193d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
193e0 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
193f0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
19400 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
19410 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
19420 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
19430 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
19440 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
19450 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
19460 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
19470 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
19480 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
19490 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
194a0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
194b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
194c0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
194d0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
194e0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
194f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19500 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
19510 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c  oto, 0, endLabel
19520 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19530 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
19540 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
19550 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
19560 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43  veLabel(v, nextC
19570 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ase);.      }.  
19580 20 20 20 20 69 66 28 20 28 6e 45 78 70 72 26 31      if( (nExpr&1
19590 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
195a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
195b0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
195c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
195d0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
195e0 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d  List->a[nExpr-1]
195f0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
19600 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19610 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
19620 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rse);.      }els
19630 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
19640 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19650 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
19660 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
19670 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
19680 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
19690 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20  Parse->nErr>0 . 
196a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
196b0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
196c0 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b  ==iCacheLevel );
196d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
196e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
196f0 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
19700 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19710 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19720 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
19730 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b  case TK_RAISE: {
19740 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19750 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
19760 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20  OE_Rollback .   
19770 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
19780 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41  ->affinity==OE_A
19790 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20  bort.           
197a0 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
197b0 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20  ty==OE_Fail.    
197c0 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
197d0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
197e0 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  nore.      );.  
197f0 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
19800 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a  >pTriggerTab ){.
19810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19820 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19840 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20         "RAISE() 
19850 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
19860 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
19870 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20  r-program");.   
19880 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
19890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
198a0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
198b0 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
198c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79        sqlite3May
198d0 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
198e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
198f0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
19900 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
19910 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
19920 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
19930 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
19940 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
19950 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
19960 20 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f              v, O
19970 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f  P_Halt, SQLITE_O
19980 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c  K, OE_Ignore, 0,
19990 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
199a0 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ,0);.        Vdb
199b0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
199c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
199d0 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f     sqlite3HaltCo
199e0 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
199f0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
19a00 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20  NT_TRIGGER,.    
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
19a30 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72  >affinity, pExpr
19a40 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30  ->u.zToken, 0, 0
19a50 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
19a60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19a70 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
19a80 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19a90 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
19aa0 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
19ab0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19ac0 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
19ad0 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
19ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20  }../*.** Factor 
19af0 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20  out the code of 
19b00 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
19b10 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69  sion to initiali
19b20 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a  zation time..*/.
19b30 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
19b40 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61  CodeAtInit(.  Pa
19b50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
19b60 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
19b70 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
19b80 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
19b90 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63   expression to c
19ba0 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56 44 42  ode when the VDB
19bb0 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f  E initializes */
19bc0 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74 2c 20  .  int regDest, 
19bd0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
19be0 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  e value in this 
19bf0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38  register */.  u8
19c00 20 72 65 75 73 61 62 6c 65 20 20 20 20 20 20 20   reusable       
19c10 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
19c20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
19c30 75 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45  usable */.){.  E
19c40 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73  xprList *p;.  as
19c50 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f  sert( ConstFacto
19c60 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20  rOk(pParse) );. 
19c70 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f   p = pParse->pCo
19c80 6e 73 74 45 78 70 72 3b 0a 20 20 70 45 78 70 72  nstExpr;.  pExpr
19c90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
19ca0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
19cb0 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73  xpr, 0);.  p = s
19cc0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
19cd0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20  pend(pParse, p, 
19ce0 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20  pExpr);.  if( p 
19cf0 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20 45  ){.     struct E
19d00 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
19d10 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
19d20 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49  Expr-1];.     pI
19d30 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
19d40 72 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a  rReg = regDest;.
19d50 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75 73       pItem->reus
19d60 61 62 6c 65 20 3d 20 72 65 75 73 61 62 6c 65 3b  able = reusable;
19d70 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70  .  }.  pParse->p
19d80 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 7d  ConstExpr = p;.}
19d90 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
19da0 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
19db0 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
19dc0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
19dd0 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20  sults.** into a 
19de0 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72  register.  Retur
19df0 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  n the register n
19e00 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20  umber where the 
19e10 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73  results.** are s
19e20 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tored..**.** If 
19e30 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20  the register is 
19e40 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  a temporary regi
19e50 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65  ster that can be
19e60 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a   deallocated,.**
19e70 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20   then write its 
19e80 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65  number into *pRe
19e90 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c  g.  If the resul
19ea0 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  t register is no
19eb0 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  t.** a temporary
19ec0 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67  , then set *pReg
19ed0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   to zero..**.** 
19ee0 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
19ef0 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69  nstant, then thi
19f00 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
19f10 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a  generate this.**
19f20 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68   code to fill th
19f30 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  e register in th
19f40 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
19f50 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a   section of the.
19f60 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c  ** VDBE program,
19f70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63   in order to fac
19f80 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68  tor it out of th
19f90 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f  e evaluation loo
19fa0 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
19fb0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61  3ExprCodeTemp(Pa
19fc0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
19fd0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70  r *pExpr, int *p
19fe0 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a  Reg){.  int r2;.
19ff0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
1a000 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1a010 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43  (pExpr);.  if( C
1a020 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
1a030 72 73 65 29 0a 20 20 20 26 26 20 70 45 78 70 72  rse).   && pExpr
1a040 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
1a050 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45  R.   && sqlite3E
1a060 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
1a070 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b  Join(pExpr).  ){
1a080 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1a090 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73   = pParse->pCons
1a0a0 74 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69  tExpr;.    int i
1a0b0 3b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30  ;.    *pReg  = 0
1a0c0 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
1a0d0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1a0e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1a0f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65  ;.      for(pIte
1a100 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78  m=p->a, i=p->nEx
1a110 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b  pr; i>0; pItem++
1a120 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  , i--){.        
1a130 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61  if( pItem->reusa
1a140 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45 78  ble && sqlite3Ex
1a150 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d  prCompare(pItem-
1a160 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31 29  >pExpr,pExpr,-1)
1a170 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1a180 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75   return pItem->u
1a190 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a  .iConstExprReg;.
1a1a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a1b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 32 20 3d  }.    }.    r2 =
1a1c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a1d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1a1e0 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
1a1f0 65 2c 20 70 45 78 70 72 2c 20 72 32 2c 20 31 29  e, pExpr, r2, 1)
1a200 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1a210 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
1a220 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1a230 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69  );.    r2 = sqli
1a240 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1a250 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1a260 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32   r1);.    if( r2
1a270 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70  ==r1 ){.      *p
1a280 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65  Reg = r1;.    }e
1a290 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1a2a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1a2b0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
1a2c0 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20      *pReg = 0;. 
1a2d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1a2e0 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n r2;.}../*.** G
1a2f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1a300 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
1a310 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
1a320 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
1a330 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
1a340 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
1a350 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
1a360 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
1a370 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
1a380 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f  er target..*/.vo
1a390 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1a3a0 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
1a3b0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1a3c0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e  nt target){.  in
1a3d0 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65  t inReg;..  asse
1a3e0 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
1a3f0 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
1a400 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45  nMem );.  if( pE
1a410 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  xpr && pExpr->op
1a420 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  ==TK_REGISTER ){
1a430 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a440 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
1a450 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  Vdbe, OP_Copy, p
1a460 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
1a470 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
1a480 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1a490 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1a4a0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1a4b0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73   target);.    as
1a4c0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
1a4d0 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  dbe || pParse->d
1a4e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a4f0 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67  );.    if( inReg
1a500 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72  !=target && pPar
1a510 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
1a520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a530 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
1a540 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  be, OP_SCopy, in
1a550 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
1a560 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1a570 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1a580 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
1a590 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
1a5a0 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
1a5b0 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
1a5c0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
1a5d0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
1a5e0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
1a5f0 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
1a600 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49 66  ster target.  If
1a610 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1a620 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  is constant, the
1a630 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
1a640 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74  * might choose t
1a650 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72 65  o code the expre
1a660 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c  ssion at initial
1a670 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f  ization time..*/
1a680 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1a690 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
1a6a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1a6b0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1a6c0 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70  target){.  if( p
1a6d0 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
1a6e0 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45  ctor && sqlite3E
1a6f0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
1a700 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  xpr) ){.    sqli
1a710 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
1a720 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1a730 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d   target, 0);.  }
1a740 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1a750 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1a760 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
1a770 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
1a780 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1a790 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67  t evalutes the g
1a7a0 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
1a7b0 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73  and puts the res
1a7c0 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ult.** in regist
1a7d0 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  er target..**.**
1a7e0 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70   Also make a cop
1a7f0 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
1a800 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ion results into
1a810 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22   another "cache"
1a820 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
1a830 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72   modify the expr
1a840 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  ession so that t
1a850 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20  he next time it 
1a860 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a  is evaluated,.**
1a870 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
1a880 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63   copy of the cac
1a890 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  he register..**.
1a8a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a8b0 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72  is used for expr
1a8c0 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
1a8d0 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a   used multiple .
1a8e0 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20  ** times.  They 
1a8f0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  are evaluated on
1a900 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  ce and the resul
1a910 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ts of the expres
1a920 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73  sion.** are reus
1a930 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1a940 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61  te3ExprCodeAndCa
1a950 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
1a960 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1a970 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
1a980 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1a990 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d  >pVdbe;.  int iM
1a9a0 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  em;..  assert( t
1a9b0 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
1a9c0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1a9d0 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
1a9e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a9f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1aa00 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20  target);.  iMem 
1aa10 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1aa20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1aa30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
1aa40 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b  , target, iMem);
1aa50 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  .  exprToRegiste
1aa60 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a  r(pExpr, iMem);.
1aa70 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
1aa80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
1aa90 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a  E_EXPLAIN)./*.**
1aaa0 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61   Generate a huma
1aab0 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61  n-readable expla
1aac0 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70  nation of an exp
1aad0 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
1aae0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1aaf0 6c 61 69 6e 45 78 70 72 28 56 64 62 65 20 2a 70  lainExpr(Vdbe *p
1ab00 4f 75 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Out, Expr *pExpr
1ab10 29 7b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  ){.  int op;    
1ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ab30 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69  * The opcode bei
1ab40 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f  ng coded */.  co
1ab50 6e 73 74 20 63 68 61 72 20 2a 7a 42 69 6e 4f 70  nst char *zBinOp
1ab60 20 3d 20 30 3b 20 20 20 2f 2a 20 42 69 6e 61 72   = 0;   /* Binar
1ab70 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  y operator */.  
1ab80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 6e 69  const char *zUni
1ab90 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 55 6e 61  Op = 0;   /* Una
1aba0 72 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ry operator */. 
1abb0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
1abc0 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c  .    op = TK_NUL
1abd0 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
1abe0 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
1abf0 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70    }.  switch( op
1ac00 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
1ac10 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
1ac20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ac30 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1ac40 41 47 47 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20  AGG{%d:%d}",.   
1ac50 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1ac60 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  iTable, pExpr->i
1ac70 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
1ac80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ac90 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
1aca0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
1acb0 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20  r->iTable<0 ){. 
1acc0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f         /* This o
1acd0 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
1ace0 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f   coding check co
1acf0 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
1ad00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1ad10 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1ad20 22 43 4f 4c 55 4d 4e 28 25 64 29 22 2c 20 70 45  "COLUMN(%d)", pE
1ad30 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1ad40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ad50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ad60 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1ad70 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20  {%d:%d}",.      
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad90 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
1ada0 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f  able, pExpr->iCo
1adb0 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lumn);.      }. 
1adc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1add0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
1ade0 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69  TEGER: {.      i
1adf0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
1ae00 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
1ae10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ae20 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1ae30 75 74 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d  ut, "%d", pExpr-
1ae40 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20  >u.iValue);.    
1ae50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ae60 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1ae70 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 22  rintf(pOut, "%s"
1ae80 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1ae90 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
1aea0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1aeb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1aec0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1aed0 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
1aee0 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  OAT: {.      sql
1aef0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1af00 66 28 70 4f 75 74 2c 22 25 73 22 2c 20 70 45 78  f(pOut,"%s", pEx
1af10 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1af20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1af30 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1af40 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
1af50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1af60 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1af70 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %Q", pExpr->u.zT
1af80 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
1af90 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1afa0 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
1afb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1afc0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 4e  inPrintf(pOut,"N
1afd0 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ULL");.      bre
1afe0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1aff0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
1b000 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
1b010 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
1b020 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b030 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1b040 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %s", pExpr->u.zT
1b050 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
1b060 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1b070 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
1b080 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73  IABLE: {.      s
1b090 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b0a0 6e 74 66 28 70 4f 75 74 2c 22 56 41 52 49 41 42  ntf(pOut,"VARIAB
1b0b0 4c 45 28 25 73 2c 25 64 29 22 2c 0a 20 20 20 20  LE(%s,%d)",.    
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0d0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
1b0e0 7a 54 6f 6b 65 6e 2c 20 70 45 78 70 72 2d 3e 69  zToken, pExpr->i
1b0f0 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
1b100 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1b110 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
1b120 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1b130 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b140 4f 75 74 2c 22 52 45 47 49 53 54 45 52 28 25 64  Out,"REGISTER(%d
1b150 29 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  )", pExpr->iTabl
1b160 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1b170 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b180 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73  TK_AS: {.      s
1b190 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1b1a0 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
1b1b0 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Left);.      bre
1b1c0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1b1d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
1b1e0 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ST.    case TK_C
1b1f0 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  AST: {.      /* 
1b200 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
1b210 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28  he form:   CAST(
1b220 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20  pLeft AS token) 
1b230 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
1b240 68 61 72 20 2a 7a 41 66 66 20 3d 20 22 75 6e 6b  har *zAff = "unk
1b250 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  ";.      switch(
1b260 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
1b270 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
1b280 6f 6b 65 6e 2c 20 30 29 20 29 7b 0a 20 20 20 20  oken, 0) ){.    
1b290 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b2a0 41 46 46 5f 54 45 58 54 3a 20 20 20 20 7a 41 66  AFF_TEXT:    zAf
1b2b0 66 20 3d 20 22 54 45 58 54 22 3b 20 20 20 20 20  f = "TEXT";     
1b2c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
1b2d0 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
1b2e0 4f 4e 45 3a 20 20 20 20 7a 41 66 66 20 3d 20 22  ONE:    zAff = "
1b2f0 4e 4f 4e 45 22 3b 20 20 20 20 20 62 72 65 61 6b  NONE";     break
1b300 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  ;.        case S
1b310 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
1b320 43 3a 20 7a 41 66 66 20 3d 20 22 4e 55 4d 45 52  C: zAff = "NUMER
1b330 49 43 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  IC";  break;.   
1b340 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1b350 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 20 7a 41  _AFF_INTEGER: zA
1b360 66 66 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 20  ff = "INTEGER"; 
1b370 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b380 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
1b390 52 45 41 4c 3a 20 20 20 20 7a 41 66 66 20 3d 20  REAL:    zAff = 
1b3a0 22 52 45 41 4c 22 3b 20 20 20 20 20 62 72 65 61  "REAL";     brea
1b3b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1b3c0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b3d0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53  rintf(pOut, "CAS
1b3e0 54 2d 25 73 28 22 2c 20 7a 41 66 66 29 3b 0a 20  T-%s(", zAff);. 
1b3f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b400 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1b410 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1b420 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b430 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29  nPrintf(pOut, ")
1b440 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1b450 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1b460 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
1b470 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
1b480 5f 4c 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _LT:      zBinOp
1b490 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 62 72 65   = "LT";     bre
1b4a0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1b4b0 4c 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  LE:      zBinOp 
1b4c0 3d 20 22 4c 45 22 3b 20 20 20 20 20 62 72 65 61  = "LE";     brea
1b4d0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
1b4e0 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  T:      zBinOp =
1b4f0 20 22 47 54 22 3b 20 20 20 20 20 62 72 65 61 6b   "GT";     break
1b500 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
1b510 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
1b520 22 47 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "GE";     break;
1b530 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
1b540 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1b550 4e 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  NE";     break;.
1b560 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
1b570 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 45       zBinOp = "E
1b580 51 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  Q";     break;. 
1b590 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20     case TK_IS:  
1b5a0 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53      zBinOp = "IS
1b5b0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1b5c0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1b5d0 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53 4e     zBinOp = "ISN
1b5e0 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  OT";  break;.   
1b5f0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20   case TK_AND:   
1b600 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 4e 44 22    zBinOp = "AND"
1b610 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1b620 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20  case TK_OR:     
1b630 20 7a 42 69 6e 4f 70 20 3d 20 22 4f 52 22 3b 20   zBinOp = "OR"; 
1b640 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1b650 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20  ase TK_PLUS:    
1b660 7a 42 69 6e 4f 70 20 3d 20 22 41 44 44 22 3b 20  zBinOp = "ADD"; 
1b670 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1b680 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a  se TK_STAR:    z
1b690 42 69 6e 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20  BinOp = "MUL";  
1b6a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1b6b0 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 42  e TK_MINUS:   zB
1b6c0 69 6e 4f 70 20 3d 20 22 53 55 42 22 3b 20 20 20  inOp = "SUB";   
1b6d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1b6e0 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 42 69   TK_REM:     zBi
1b6f0 6e 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20  nOp = "REM";    
1b700 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1b710 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 42 69 6e  TK_BITAND:  zBin
1b720 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 62  Op = "BITAND"; b
1b730 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b740 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 42 69 6e 4f  K_BITOR:   zBinO
1b750 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 62 72  p = "BITOR";  br
1b760 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1b770 5f 53 4c 41 53 48 3a 20 20 20 7a 42 69 6e 4f 70  _SLASH:   zBinOp
1b780 20 3d 20 22 44 49 56 22 3b 20 20 20 20 62 72 65   = "DIV";    bre
1b790 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1b7a0 4c 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20  LSHIFT:  zBinOp 
1b7b0 3d 20 22 4c 53 48 49 46 54 22 3b 20 62 72 65 61  = "LSHIFT"; brea
1b7c0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
1b7d0 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d  SHIFT:  zBinOp =
1b7e0 20 22 52 53 48 49 46 54 22 3b 20 62 72 65 61 6b   "RSHIFT"; break
1b7f0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
1b800 4e 43 41 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20  NCAT:  zBinOp = 
1b810 22 43 4f 4e 43 41 54 22 3b 20 62 72 65 61 6b 3b  "CONCAT"; break;
1b820 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  ..    case TK_UM
1b830 49 4e 55 53 3a 20 20 7a 55 6e 69 4f 70 20 3d 20  INUS:  zUniOp = 
1b840 22 55 4d 49 4e 55 53 22 3b 20 62 72 65 61 6b 3b  "UMINUS"; break;
1b850 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
1b860 55 53 3a 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22  US:   zUniOp = "
1b870 55 50 4c 55 53 22 3b 20 20 62 72 65 61 6b 3b 0a  UPLUS";  break;.
1b880 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
1b890 4f 54 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 42  OT:  zUniOp = "B
1b8a0 49 54 4e 4f 54 22 3b 20 62 72 65 61 6b 3b 0a 20  ITNOT"; break;. 
1b8b0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
1b8c0 20 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f      zUniOp = "NO
1b8d0 54 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  T";    break;.  
1b8e0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
1b8f0 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 49 53 4e  :  zUniOp = "ISN
1b900 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ULL"; break;.   
1b910 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
1b920 3a 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e  : zUniOp = "NOTN
1b930 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  ULL"; break;..  
1b940 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54    case TK_COLLAT
1b950 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1b960 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1b970 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1b980 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b990 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b9a0 75 74 2c 22 2e 43 4f 4c 4c 41 54 45 28 25 73 29  ut,".COLLATE(%s)
1b9b0 22 2c 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ",pExpr->u.zToke
1b9c0 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1b9d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
1b9e0 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
1b9f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
1ba00 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
1ba10 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b  ExprList *pFarg;
1ba20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1ba30 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
1ba40 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  ents */.      if
1ba50 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1ba60 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
1ba70 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
1ba80 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20    pFarg = 0;.   
1ba90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1baa0 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d    pFarg = pExpr-
1bab0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
1bac0 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  }.      if( op==
1bad0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
1bae0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1baf0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1bb00 70 4f 75 74 2c 20 22 41 47 47 5f 46 55 4e 43 54  pOut, "AGG_FUNCT
1bb10 49 4f 4e 25 64 3a 25 73 28 22 2c 0a 20 20 20 20  ION%d:%s(",.    
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb30 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1bb40 6f 70 32 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  op2, pExpr->u.zT
1bb50 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
1bb60 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1bb70 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1bb80 28 70 4f 75 74 2c 20 22 46 55 4e 43 54 49 4f 4e  (pOut, "FUNCTION
1bb90 3a 25 73 28 22 2c 20 70 45 78 70 72 2d 3e 75 2e  :%s(", pExpr->u.
1bba0 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
1bbb0 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
1bbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1bbd0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
1bbe0 73 74 28 70 4f 75 74 2c 20 70 46 61 72 67 29 3b  st(pOut, pFarg);
1bbf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1bc00 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1bc10 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a  ntf(pOut, ")");.
1bc20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bc30 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1bc40 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1bc50 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
1bc60 54 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  TS: {.      sqli
1bc70 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1bc80 28 70 4f 75 74 2c 20 22 45 58 49 53 54 53 28 22  (pOut, "EXISTS("
1bc90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bca0 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f  ExplainSelect(pO
1bcb0 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  ut, pExpr->x.pSe
1bcc0 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  lect);.      sql
1bcd0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1bce0 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 20  f(pOut,")");.   
1bcf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1bd00 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
1bd10 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CT: {.      sqli
1bd20 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1bd30 28 70 4f 75 74 2c 20 22 28 22 29 3b 0a 20 20 20  (pOut, "(");.   
1bd40 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1bd50 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45  nSelect(pOut, pE
1bd60 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
1bd70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1bd80 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1bd90 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72  , ")");.      br
1bda0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1bdb0 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
1bdc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1bdd0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 49  nPrintf(pOut, "I
1bde0 4e 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  N(");.      sqli
1bdf0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1be00 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Out, pExpr->pLef
1be10 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1be20 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1be30 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  Out, ",");.     
1be40 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1be50 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1be60 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
1be70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1be80 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20  ainSelect(pOut, 
1be90 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1bea0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1beb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1bec0 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
1bed0 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  Out, pExpr->x.pL
1bee0 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
1bef0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1bf00 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1bf10 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  )");.      break
1bf20 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1bf30 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
1bf40 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
1bf50 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
1bf60 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
1bf70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1bf80 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1bf90 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
1bfa0 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
1bfb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
1bfc0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1bfd0 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
1bfe0 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
1bff0 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
1c000 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
1c010 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
1c020 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
1c030 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
1c040 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
1c050 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
1c060 45 78 70 72 20 2a 70 58 20 3d 20 70 45 78 70 72  Expr *pX = pExpr
1c070 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ->pLeft;.      E
1c080 78 70 72 20 2a 70 59 20 3d 20 70 45 78 70 72 2d  xpr *pY = pExpr-
1c090 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
1c0a0 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72  Expr;.      Expr
1c0b0 20 2a 70 5a 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pZ = pExpr->x.
1c0c0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
1c0d0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
1c0e0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1c0f0 75 74 2c 20 22 42 45 54 57 45 45 4e 28 22 29 3b  ut, "BETWEEN(");
1c100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1c110 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1c120 70 58 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pX);.      sqlit
1c130 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1c140 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  pOut, ",");.    
1c150 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c160 45 78 70 72 28 70 4f 75 74 2c 20 70 59 29 3b 0a  Expr(pOut, pY);.
1c170 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c180 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c190 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c   ",");.      sql
1c1a0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1c1b0 70 4f 75 74 2c 20 70 5a 29 3b 0a 20 20 20 20 20  pOut, pZ);.     
1c1c0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1c1d0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29  rintf(pOut, ")")
1c1e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c1f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1c200 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20  _TRIGGER: {.    
1c210 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f    /* If the opco
1c220 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52  de is TK_TRIGGER
1c230 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
1c240 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72  ssion is a refer
1c250 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ence.      ** to
1c260 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
1c270 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
1c280 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76  pseudo-tables av
1c290 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  ailable to.     
1c2a0 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67   ** trigger prog
1c2b0 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61  rams. In this ca
1c2c0 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69  se Expr.iTable i
1c2d0 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74  s set to 1 for t
1c2e0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  he.      ** new.
1c2f0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
1c300 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64  or 0 for the old
1c310 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  .* pseudo-table.
1c320 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20   Expr.iColumn.  
1c330 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
1c340 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   the column of t
1c350 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  he pseudo-table 
1c360 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d  to read, or to -
1c370 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  1 to.      ** re
1c380 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  ad the rowid fie
1c390 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ld..      */.   
1c3a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c3b0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25  nPrintf(pOut, "%
1c3c0 73 28 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20  s(%d)", .       
1c3d0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1c3e0 20 3f 20 22 4e 45 57 22 20 3a 20 22 4f 4c 44 22   ? "NEW" : "OLD"
1c3f0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1c400 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c410 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1c420 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  K_CASE: {.      
1c430 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1c440 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53 45  intf(pOut, "CASE
1c450 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (");.      sqlit
1c460 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1c470 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1c480 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c490 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1c4a0 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
1c4b0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1c4c0 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45 78  prList(pOut, pEx
1c4d0 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
1c4e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c4f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c500 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
1c510 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
1c520 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1c530 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 75 6e 6b  ar *zType = "unk
1c540 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  ";.      switch(
1c550 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1c560 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
1c570 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20 20   OE_Rollback:   
1c580 7a 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62 61 63  zType = "rollbac
1c590 6b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  k";  break;.    
1c5a0 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72      case OE_Abor
1c5b0 74 3a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  t:      zType = 
1c5c0 22 61 62 6f 72 74 22 3b 20 20 20 20 20 62 72 65  "abort";     bre
1c5d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1c5e0 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20 20 20   OE_Fail:       
1c5f0 7a 54 79 70 65 20 3d 20 22 66 61 69 6c 22 3b 20  zType = "fail"; 
1c600 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c610 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f      case OE_Igno
1c620 72 65 3a 20 20 20 20 20 7a 54 79 70 65 20 3d 20  re:     zType = 
1c630 22 69 67 6e 6f 72 65 22 3b 20 20 20 20 62 72 65  "ignore";    bre
1c640 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1c650 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c660 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 52 41  Printf(pOut, "RA
1c670 49 53 45 2d 25 73 28 25 73 29 22 2c 20 7a 54 79  ISE-%s(%s)", zTy
1c680 70 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  pe, pExpr->u.zTo
1c690 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
1c6a0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1c6b0 20 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e 4f 70    }.  if( zBinOp
1c6c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1c6d0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1c6e0 74 2c 22 25 73 28 22 2c 20 7a 42 69 6e 4f 70 29  t,"%s(", zBinOp)
1c6f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1c700 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1c710 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1c720 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c730 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 2c 22 29  Printf(pOut,",")
1c740 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1c750 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1c760 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1c770 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c780 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22  nPrintf(pOut,")"
1c790 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  );.  }else if( z
1c7a0 55 6e 69 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c  UniOp ){.    sql
1c7b0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1c7c0 66 28 70 4f 75 74 2c 22 25 73 28 22 2c 20 7a 55  f(pOut,"%s(", zU
1c7d0 6e 69 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  niOp);.    sqlit
1c7e0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1c7f0 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1c800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1c810 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1c820 2c 22 29 22 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ,")");.  }.}.#en
1c830 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
1c840 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
1c850 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a 0a 23  E_EXPLAIN) */..#
1c860 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1c870 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1c880 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e  PLAIN)./*.** Gen
1c890 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65  erate a human-re
1c8a0 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69  adable explanati
1c8b0 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  on of an express
1c8c0 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
1c8d0 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e  d sqlite3Explain
1c8e0 45 78 70 72 4c 69 73 74 28 56 64 62 65 20 2a 70  ExprList(Vdbe *p
1c8f0 4f 75 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  Out, ExprList *p
1c900 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1c910 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c    if( pList==0 |
1c920 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  | pList->nExpr==
1c930 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1c940 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1c950 75 74 2c 20 22 28 65 6d 70 74 79 2d 6c 69 73 74  ut, "(empty-list
1c960 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  )");.    return;
1c970 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69  .  }else if( pLi
1c980 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a  st->nExpr==1 ){.
1c990 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c9a0 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c 69  inExpr(pOut, pLi
1c9b0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
1c9c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1c9d0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
1c9e0 28 70 4f 75 74 29 3b 0a 20 20 20 20 66 6f 72 28  (pOut);.    for(
1c9f0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1ca00 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1ca10 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1ca20 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 69 74 65  rintf(pOut, "ite
1ca30 6d 5b 25 64 5d 20 3d 20 22 2c 20 69 29 3b 0a 20  m[%d] = ", i);. 
1ca40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1ca50 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a 20  ainPush(pOut);. 
1ca60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1ca70 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c  ainExpr(pOut, pL
1ca80 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
1ca90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1caa0 78 70 6c 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b  xplainPop(pOut);
1cab0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
1cac0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
1cad0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1cae0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1caf0 74 2c 20 22 20 41 53 20 25 73 22 2c 20 70 4c 69  t, " AS %s", pLi
1cb00 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
1cb10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1cb20 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62  f( pList->a[i].b
1cb30 53 70 61 6e 49 73 54 61 62 20 29 7b 0a 20 20 20  SpanIsTab ){.   
1cb40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1cb50 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1cb60 22 20 28 25 73 29 22 2c 20 70 4c 69 73 74 2d 3e  " (%s)", pList->
1cb70 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[i].zSpan);.   
1cb80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
1cb90 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
1cba0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1cbb0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 4f 75 74  e3ExplainNL(pOut
1cbc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1cbd0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1cbe0 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20  ainPop(pOut);.  
1cbf0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
1cc00 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f  LITE_DEBUG */../
1cc10 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1cc20 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74  de that pushes t
1cc30 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72  he value of ever
1cc40 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  y element of the
1cc50 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
1cc60 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61  sion list into a
1cc70 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
1cc80 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
1cc90 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a   at target..**.*
1cca0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1ccb0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
1ccc0 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  evaluated..**.**
1ccd0 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c   The SQLITE_ECEL
1cce0 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e  _DUP flag preven
1ccf0 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  ts the arguments
1cd00 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66   from being.** f
1cd10 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53  illed using OP_S
1cd20 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d  Copy.  OP_Copy m
1cd30 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  ust be used inst
1cd40 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ead..**.** The S
1cd50 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
1cd60 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77  R argument allow
1cd70 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  s constant argum
1cd80 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61  ents to be.** fa
1cd90 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20  ctored out into 
1cda0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63  initialization c
1cdb0 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
1cdc0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
1cdd0 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
1cde0 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
1cdf0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1ce00 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1ce10 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  t,   /* The expr
1ce20 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62  ession list to b
1ce30 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e coded */.  int
1ce40 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20   target,        
1ce50 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
1ce60 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 75  e results */.  u
1ce70 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  8 flags         
1ce80 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c    /* SQLITE_ECEL
1ce90 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
1cea0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1ceb0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1cec0 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 75 38 20 63  int i, n;.  u8 c
1ced0 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26  opyOp = (flags &
1cee0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
1cef0 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50  ) ? OP_Copy : OP
1cf00 5f 53 43 6f 70 79 3b 0a 20 20 61 73 73 65 72 74  _SCopy;.  assert
1cf10 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
1cf20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1cf30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1cf40 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29  arse->pVdbe!=0 )
1cf50 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73  ;  /* Never gets
1cf60 20 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77   this far otherw
1cf70 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69  ise */.  n = pLi
1cf80 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28  st->nExpr;.  if(
1cf90 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28   !ConstFactorOk(
1cfa0 70 50 61 72 73 65 29 20 29 20 66 6c 61 67 73 20  pParse) ) flags 
1cfb0 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f  &= ~SQLITE_ECEL_
1cfc0 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49  FACTOR;.  for(pI
1cfd0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
1cfe0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74  0; i<n; i++, pIt
1cff0 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
1d000 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  *pExpr = pItem->
1d010 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28  pExpr;.    if( (
1d020 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
1d030 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26  CEL_FACTOR)!=0 &
1d040 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
1d050 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29  onstant(pExpr) )
1d060 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1d070 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
1d080 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1d090 67 65 74 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d  get+i, 0);.    }
1d0a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
1d0b0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
1d0c0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1d0d0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1d0e0 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66  get+i);.      if
1d0f0 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b  ( inReg!=target+
1d100 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  i ){.        Vdb
1d110 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
1d120 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1d130 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20  se->pVdbe;.     
1d140 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f     if( copyOp==O
1d150 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20  P_Copy.         
1d160 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56  && (pOp=sqlite3V
1d170 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29  dbeGetOp(v, -1))
1d180 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70  ->opcode==OP_Cop
1d190 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  y.         && pO
1d1a0 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p1+pOp->p3+1=
1d1b0 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  =inReg.         
1d1c0 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e  && pOp->p2+pOp->
1d1d0 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20  p3+1==target+i. 
1d1e0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1d1f0 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20      pOp->p3++;. 
1d200 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d210 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1d220 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
1d230 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  yOp, inReg, targ
1d240 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  et+i);.        }
1d250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d260 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
1d270 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1d280 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57   code for a BETW
1d290 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  EEN operator..**
1d2a0 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e  .**    x BETWEEN
1d2b0 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54   y AND z.**.** T
1d2c0 68 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69  he above is equi
1d2d0 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a  valent to .**.**
1d2e0 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
1d2f0 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20  z.**.** Code it 
1d300 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
1d310 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
1d320 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
1d330 69 6f 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61 74  ion.** elementat
1d340 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61  ion of x..*/.sta
1d350 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64  tic void exprCod
1d360 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73  eBetween(.  Pars
1d370 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
1d380 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1d390 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1d3a0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
1d3b0 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
1d3c0 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65  he BETWEEN expre
1d3d0 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
1d3e0 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
1d3f0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
1d400 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a   jump is taken *
1d410 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 54 72  /.  int jumpIfTr
1d420 75 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ue,   /* Take th
1d430 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
1d440 54 57 45 45 4e 20 69 73 20 74 72 75 65 20 2a 2f  TWEEN is true */
1d450 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
1d460 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65  l    /* Take the
1d470 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54   jump if the BET
1d480 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a  WEEN is NULL */.
1d490 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e  ){.  Expr exprAn
1d4a0 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e  d;     /* The AN
1d4b0 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78  D operator in  x
1d4c0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f  >=y AND x<=z  */
1d4d0 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74  .  Expr compLeft
1d4e0 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d  ;    /* The  x>=
1d4f0 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  y  term */.  Exp
1d500 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f  r compRight;   /
1d510 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72  * The  x<=z  ter
1d520 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72  m */.  Expr expr
1d530 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  X;       /* The 
1d540 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f   x  subexpressio
1d550 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  n */.  int regFr
1d560 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70  ee1 = 0; /* Temp
1d570 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
1d580 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
1d590 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1d5a0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1d5b0 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72  elect) );.  expr
1d5c0 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
1d5d0 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20  t;.  exprAnd.op 
1d5e0 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72  = TK_AND;.  expr
1d5f0 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
1d600 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
1d610 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52  .pRight = &compR
1d620 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  ight;.  compLeft
1d630 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63  .op = TK_GE;.  c
1d640 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
1d650 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65  &exprX;.  compLe
1d660 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
1d670 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
1d680 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69  .pExpr;.  compRi
1d690 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
1d6a0 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
1d6b0 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
1d6c0 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
1d6d0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1d6e0 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65  >a[1].pExpr;.  e
1d6f0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65  xprToRegister(&e
1d700 78 70 72 58 2c 20 73 71 6c 69 74 65 33 45 78 70  xprX, sqlite3Exp
1d710 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1d720 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
1d730 65 65 31 29 29 3b 0a 20 20 69 66 28 20 6a 75 6d  ee1));.  if( jum
1d740 70 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20 73  pIfTrue ){.    s
1d750 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1d760 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
1d770 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
1d780 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ull);.  }else{. 
1d790 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1d7a0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65  False(pParse, &e
1d7b0 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
1d7c0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  mpIfNull);.  }. 
1d7d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1d7e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1d7f0 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20  egFree1);..  /* 
1d800 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20  Ensure adequate 
1d810 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f  test coverage */
1d820 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1d830 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
1d840 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1d850 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1d860 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d870 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1d880 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1d890 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
1d8a0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1d8b0 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
1d8c0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1d8d0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1d8e0 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1d8f0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1d900 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1d910 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1d920 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
1d930 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
1d940 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1d950 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1d960 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1d970 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1d980 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
1d990 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1d9a0 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
1d9b0 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
1d9c0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
1d9d0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1d9e0 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1d9f0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1da00 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e1!=0 );.}../*.*
1da10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1da20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
1da30 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
1da40 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
1da50 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
1da60 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
1da70 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
1da80 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  ue but execution
1da90 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
1daa0 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
1dab0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1dac0 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
1dad0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1dae0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
1daf0 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
1db00 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e  nor false), then
1db10 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
1db20 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e  p if the jumpIfN
1db30 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49  ull flag is SQLI
1db40 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a  TE_JUMPIFNULL..*
1db50 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
1db60 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
1db70 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
1db80 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
1db90 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
1dba0 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
1dbb0 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
1dbc0 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
1dbd0 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
1dbe0 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
1dbf0 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
1dc00 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
1dc10 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
1dc20 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
1dc30 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
1dc40 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
1dc50 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
1dc60 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
1dc70 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
1dc80 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
1dc90 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
1dca0 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
1dcb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1dcc0 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
1dcd0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1dce0 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
1dcf0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1dd00 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1dd10 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1dd20 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
1dd30 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
1dd40 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
1dd50 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
1dd60 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
1dd70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
1dd80 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
1dd90 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1dda0 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
1ddb0 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f  )     return;  /
1ddc0 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56  * Existence of V
1ddd0 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
1dde0 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e  aller */.  if( N
1ddf0 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29  EVER(pExpr==0) )
1de00 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20   return;  /* No 
1de10 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70  way this can hap
1de20 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45  pen */.  op = pE
1de30 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63  xpr->op;.  switc
1de40 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
1de50 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
1de60 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
1de70 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1de80 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
1de90 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1dea0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1deb0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1dec0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1ded0 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c  ft, d2,jumpIfNul
1dee0 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
1def0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
1df00 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1df10 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1df20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1df30 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1df40 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1df50 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1df60 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1df70 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
1df80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1df90 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1dfa0 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
1dfb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1dfc0 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
1dfd0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1dfe0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1dff0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1e000 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1e010 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
1e020 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1e030 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1e040 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1e050 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e060 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1e070 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1e080 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1e090 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e0a0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1e0b0 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
1e0c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e0d0 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
1e0e0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e0f0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1e100 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1e110 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1e120 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1e130 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1e140 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e150 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1e160 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
1e170 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
1e180 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
1e190 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
1e1a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
1e1b0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1e1c0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1e1d0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1e1e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e1f0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e200 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1e210 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1e220 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e230 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1e240 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1e250 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
1e260 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1e270 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1e280 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1e290 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e2a0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1e2b0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1e2c0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1e2d0 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
1e2e0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
1e2f0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e300 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
1e310 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
1e320 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
1e330 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
1e340 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1e350 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
1e360 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
1e370 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
1e380 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
1e390 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1e3a0 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
1e3b0 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
1e3c0 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
1e3d0 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
1e3e0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e3f0 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
1e400 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
1e410 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1e420 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65  OP_Eq); VdbeCove
1e430 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1e440 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Eq);.      asser
1e450 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
1e460 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1e470 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ne); VdbeCovera
1e480 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65  geIf(v,op==OP_Ne
1e490 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e4a0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1e4b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e4c0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1e4d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e4e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e4f0 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1e500 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  ISNOT: {.      t
1e510 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e520 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
1e530 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1e540 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1e550 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e560 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1e570 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1e580 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1e590 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e5a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1e5b0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1e5c0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f  gFree2);.      o
1e5d0 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
1e5e0 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
1e5f0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1e600 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1e610 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1e620 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1e640 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49  , r2, dest, SQLI
1e650 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
1e660 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1e670 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a  (v, op==TK_EQ);.
1e680 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1e690 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1e6a0 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  E);.      testca
1e6b0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1e6c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e6d0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1e6e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e6f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e700 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
1e710 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
1e720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e730 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
1e740 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ll );   testcase
1e750 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
1e760 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e770 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
1e780 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63  NotNull ); testc
1e790 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
1e7a0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ULL );.      r1 
1e7b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e7c0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1e7d0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1e7e0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1e7f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e800 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
1e810 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1e820 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1e830 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
1e840 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e850 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
1e860 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e870 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1e880 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e890 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e8a0 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
1e8b0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1e8c0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1e8d0 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
1e8e0 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
1e8f0 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d 70 49  , dest, 1, jumpI
1e900 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1e910 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1e920 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1e930 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
1e940 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
1e950 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
1e960 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1e970 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1e980 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
1e990 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64  = jumpIfNull ? d
1e9a0 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73  est : destIfFals
1e9b0 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
1e9c0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1e9d0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66  e, pExpr, destIf
1e9e0 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c  False, destIfNul
1e9f0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1ea00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ea10 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29  P_Goto, 0, dest)
1ea20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ea30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1ea40 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
1ea50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ea60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
1ea70 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1ea80 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72  if( exprAlwaysTr
1ea90 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ue(pExpr) ){.   
1eaa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1eab0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1eac0 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  o, 0, dest);.   
1ead0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70     }else if( exp
1eae0 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
1eaf0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
1eb00 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * No-op */.     
1eb10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1eb20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1eb30 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1eb40 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
1eb50 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
1eb60 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1eb70 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74   OP_If, r1, dest
1eb80 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
1eb90 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
1eba0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1ebb0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1ebc0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1ebd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1ebe0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1ebf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1ec00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1ec10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1ec20 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1ec30 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
1ec40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1ec50 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1ec60 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  2);  .}../*.** G
1ec70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1ec80 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
1ec90 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
1eca0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
1ecb0 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
1ecc0 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
1ecd0 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
1ece0 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
1ecf0 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
1ed00 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
1ed10 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
1ed20 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
1ed30 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
1ed40 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
1ed50 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
1ed60 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20   false) then.** 
1ed70 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75  jump if jumpIfNu
1ed80 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ll is SQLITE_JUM
1ed90 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20  PIFNULL or fall 
1eda0 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49  through if jumpI
1edb0 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a  fNull.** is 0..*
1edc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1edd0 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
1ede0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1edf0 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
1ee00 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1ee10 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1ee20 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1ee30 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
1ee40 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
1ee50 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1ee60 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
1ee70 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
1ee80 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
1ee90 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
1eea0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
1eeb0 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
1eec0 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73   return; /* Exis
1eed0 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tence of VDBE ch
1eee0 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
1eef0 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  */.  if( pExpr==
1ef00 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a  0 )    return;..
1ef10 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
1ef20 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  f pExpr->op and 
1ef30 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61  op are related a
1ef40 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
1ef50 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72    **       pExpr
1ef60 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
1ef70 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d  op.  **       --
1ef80 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20  -------         
1ef90 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a   ----------.  **
1efa0 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c         TK_ISNULL
1efb0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74            OP_Not
1efc0 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
1efd0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20  TK_NOTNULL      
1efe0 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a     OP_IsNull.  *
1eff0 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20  *       TK_NE   
1f000 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71             OP_Eq
1f010 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45  .  **       TK_E
1f020 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  Q              O
1f030 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Ne.  **       
1f040 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20  TK_GT           
1f050 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20     OP_Le.  **   
1f060 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20      TK_LE       
1f070 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a         OP_Gt.  *
1f080 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20  *       TK_GE   
1f090 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74             OP_Lt
1f0a0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
1f0b0 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
1f0c0 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  P_Ge.  **.  ** F
1f0d0 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20  or other values 
1f0e0 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70  of pExpr->op, op
1f0f0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   is undefined an
1f100 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54  d unused..  ** T
1f110 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20  he value of TK_ 
1f120 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
1f130 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73  s are arranged s
1f140 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a  uch that we.  **
1f150 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
1f160 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75   mapping above u
1f170 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sing the followi
1f180 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20  ng expression.. 
1f190 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65   ** Assert()s ve
1f1a0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f  rify that the co
1f1b0 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72  mputation is cor
1f1c0 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20  rect..  */.  op 
1f1d0 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54  = ((pExpr->op+(T
1f1e0 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d  K_ISNULL&1))^1)-
1f1f0 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a  (TK_ISNULL&1);..
1f200 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72    /* Verify corr
1f210 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  ect alignment of
1f220 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
1f230 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  stants.  */.  as
1f240 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1f250 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70  =TK_ISNULL || op
1f260 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
1f270 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1f280 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op!=TK_NOTNULL 
1f290 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  || op==OP_IsNull
1f2a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1f2b0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c  xpr->op!=TK_NE |
1f2c0 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  | op==OP_Eq );. 
1f2d0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f2e0 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d  op!=TK_EQ || op=
1f2f0 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ne );.  asse
1f300 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1f310 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LT || op==OP_G
1f320 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1f330 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20  Expr->op!=TK_LE 
1f340 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a  || op==OP_Gt );.
1f350 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1f360 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70  >op!=TK_GT || op
1f370 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73  ==OP_Le );.  ass
1f380 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1f390 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GE || op==OP_
1f3a0 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  Lt );..  switch(
1f3b0 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
1f3c0 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
1f3d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f3e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1f3f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f400 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1f410 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f420 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f430 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1f440 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1f450 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1f460 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1f470 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f480 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1f490 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1f4a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f4b0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1f4c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f4d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1f4e0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
1f4f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1f500 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1f510 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1f520 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1f530 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1f540 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1f550 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75  r->pLeft, d2, ju
1f560 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
1f570 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1f580 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f590 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1f5a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f5b0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1f5c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f5d0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f5e0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1f5f0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f600 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
1f610 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f620 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1f630 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f640 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1f650 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1f660 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1f670 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f680 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1f690 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f6a0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1f6b0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1f6c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f6d0 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1f6e0 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1f6f0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1f700 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1f710 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1f720 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1f730 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1f740 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1f750 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f760 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f770 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f780 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f790 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1f7a0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f7b0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1f7c0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1f7d0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1f7e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f7f0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1f800 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1f810 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1f820 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
1f830 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
1f840 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
1f850 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f860 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
1f870 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1f880 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
1f890 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
1f8a0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f8b0 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
1f8c0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
1f8d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1f8e0 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
1f8f0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
1f900 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f910 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
1f920 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f930 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
1f940 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
1f950 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f960 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
1f970 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
1f980 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
1f990 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
1f9a0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f9b0 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1f9c0 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
1f9d0 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
1f9e0 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
1f9f0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1fa00 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
1fa10 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1fa20 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1fa30 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fa40 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1fa50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1fa60 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1fa70 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
1fa80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fa90 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1faa0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1fab0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
1fac0 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
1fad0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1fae0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1faf0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1fb00 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1fb10 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1fb20 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fb30 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1fb40 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1fb50 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d      op = (pExpr-
1fb60 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  >op==TK_IS) ? TK
1fb70 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20  _NE : TK_EQ;.   
1fb80 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1fb90 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1fba0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1fbb0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1fbc0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1fbd0 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e  , dest, SQLITE_N
1fbe0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
1fbf0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1fc00 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20  op==TK_EQ);.    
1fc10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1fc20 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a  (v, op==TK_NE);.
1fc30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fc40 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1fc50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1fc60 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1fc70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fc80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1fc90 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1fca0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1fcb0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1fcc0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fcd0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1fce0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1fcf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1fd00 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
1fd10 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
1fd20 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1fd30 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f  NULL );   VdbeCo
1fd40 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1fd50 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
1fd60 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fd70 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56  TK_NOTNULL );  V
1fd80 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1fd90 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
1fda0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fdb0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1fdc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fdd0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1fde0 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
1fdf0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1fe00 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1fe10 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
1fe20 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
1fe30 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66   dest, 0, jumpIf
1fe40 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1fe50 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1fe60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1fe70 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
1fe80 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
1fe90 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b  f( jumpIfNull ){
1fea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1feb0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1fec0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1fed0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
1fee0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1fef0 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
1ff00 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1ff10 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
1ff20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
1ff30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1ff40 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  est, destIfNull)
1ff50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ff60 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1ff70 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
1ff80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ff90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1ffa0 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
1ffb0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 70   {.      if( exp
1ffc0 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
1ffd0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
1ffe0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1fff0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
20000 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
20010 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
20020 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a  sTrue(pExpr) ){.
20030 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70          /* no-op
20040 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
20050 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
20060 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
20070 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
20080 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
20090 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
200a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
200b0 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  ot, r1, dest, ju
200c0 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
200d0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
200e0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  ge(v);.        t
200f0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20100 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
20110 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
20120 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
20130 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
20140 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
20150 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
20160 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
20170 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
20180 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
20190 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
201a0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
201b0 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
201c0 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
201d0 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30  trees.  Return 0
201e0 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
201f0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63  xpressions are c
20200 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69  ompletely identi
20210 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69  cal.  Return 1 i
20220 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e  f they differ on
20230 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41  ly.** by a COLLA
20240 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74  TE operator at t
20250 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52  he top level.  R
20260 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65  eturn 2 if there
20270 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73   are differences
20280 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74  .** other than t
20290 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c  he top-level COL
202a0 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LATE operator..*
202b0 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
202c0 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
202d0 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
202e0 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
202f0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
20300 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
20310 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
20320 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
20330 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
20340 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69  .**.** The pA si
20350 64 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e  de might be usin
20360 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20  g TK_REGISTER.  
20370 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
20380 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a  ase and pB is.**
20390 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45   not using TK_RE
203a0 47 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74  GISTER but is ot
203b0 68 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65  herwise equivale
203c0 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72  nt, then still r
203d0 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53  eturn 0..**.** S
203e0 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f  ometimes this ro
203f0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
20400 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20  n 2 even if the 
20410 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  two expressions.
20420 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71  ** really are eq
20430 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65  uivalent.  If we
20440 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68   cannot prove th
20450 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
20460 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69  ns are.** identi
20470 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32  cal, we return 2
20480 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
20490 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
204a0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
204b0 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20   2, then you do 
204c0 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20  not really know 
204d0 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74  for certain if t
204e0 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
204f0 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
20500 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  me.  But if you 
20510 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74  get a 0 or 1 ret
20520 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a  urn, then you.**
20530 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65   can be sure the
20540 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
20550 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74   the same.  In t
20560 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a  he places where.
20570 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
20580 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73  is used, it does
20590 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74   not hurt to get
205a0 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68   an extra 2 - th
205b0 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
205c0 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
205d0 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
205e0 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
205f0 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
20600 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c  rect 0 or 1 coul
20610 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66  d lead to a malf
20620 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
20630 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
20640 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
20650 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  r *pB, int iTab)
20660 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64  {.  u32 combined
20670 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d  Flags;.  if( pA=
20680 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20  =0 || pB==0 ){. 
20690 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41     return pB==pA
206a0 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20   ? 0 : 2;.  }.  
206b0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20  combinedFlags = 
206c0 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e  pA->flags | pB->
206d0 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d  flags;.  if( com
206e0 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
206f0 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
20700 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70  if( (pA->flags&p
20710 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56  B->flags&EP_IntV
20720 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e  alue)!=0 && pA->
20730 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e  u.iValue==pB->u.
20740 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  iValue ){.      
20750 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
20760 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
20770 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
20780 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66  pB->op ){.    if
20790 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pA->op==TK_COL
207a0 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
207b0 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
207c0 4c 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c  Left, pB, iTab)<
207d0 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
207e0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
207f0 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pB->op==TK_CO
20800 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
20810 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20  ExprCompare(pA, 
20820 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  pB->pLeft, iTab)
20830 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
20840 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
20850 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
20860 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
20870 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28  OLUMN && ALWAYS(
20880 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43  pA->op!=TK_AGG_C
20890 4f 4c 55 4d 4e 29 20 26 26 20 70 41 2d 3e 75 2e  OLUMN) && pA->u.
208a0 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  zToken ){.    if
208b0 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a  ( strcmp(pA->u.z
208c0 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
208d0 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  en)!=0 ){.      
208e0 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54  return pA->op==T
208f0 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20  K_COLLATE ? 1 : 
20900 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
20910 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
20920 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
20930 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
20940 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
20950 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   2;.  if( ALWAYS
20960 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ((combinedFlags 
20970 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d  & EP_TokenOnly)=
20980 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63  =0) ){.    if( c
20990 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
209a0 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65  P_xIsSelect ) re
209b0 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
209c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
209d0 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
209e0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29  ->pLeft, iTab) )
209f0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
20a00 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
20a10 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74  mpare(pA->pRight
20a20 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pB->pRight, iT
20a30 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
20a40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
20a50 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
20a60 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e  A->x.pList, pB->
20a70 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29  x.pList, iTab) )
20a80 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
20a90 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69  f( ALWAYS((combi
20aa0 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65  nedFlags & EP_Re
20ab0 64 75 63 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  duced)==0) ){.  
20ac0 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c      if( pA->iCol
20ad0 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
20ae0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
20af0 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c     if( pA->iTabl
20b00 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20  e!=pB->iTable . 
20b10 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54        && (pA->iT
20b20 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45  able!=iTab || NE
20b30 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d  VER(pB->iTable>=
20b40 30 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  0)) ) return 2;.
20b50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20b60 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
20b70 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c  ompare two ExprL
20b80 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65  ist objects.  Re
20b90 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61  turn 0 if they a
20ba0 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64  re identical and
20bb0 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   .** non-zero if
20bc0 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20   they differ in 
20bd0 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  any way..**.** I
20be0 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
20bf0 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
20c00 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
20c10 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
20c20 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
20c30 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
20c40 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
20c50 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
20c60 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
20c70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
20c80 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ght return non-z
20c90 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65  ero for equivale
20ca0 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54  nt ExprLists.  T
20cb0 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65  he.** only conse
20cc0 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64  quence will be d
20cd0 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61  isabled optimiza
20ce0 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73  tions.  But this
20cf0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74   routine.** must
20d00 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20   never return 0 
20d10 69 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c  if the two ExprL
20d20 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ist objects are 
20d30 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a  different, or.**
20d40 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77   a malfunction w
20d50 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  ill result..**.*
20d60 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74  * Two NULL point
20d70 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ers are consider
20d80 65 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d  ed to be the sam
20d90 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70  e.  But a NULL p
20da0 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73  ointer.** always
20db0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20   differs from a 
20dc0 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  non-NULL pointer
20dd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20de0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
20df0 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78  ExprList *pA, Ex
20e00 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20  prList *pB, int 
20e10 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iTab){.  int i;.
20e20 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70    if( pA==0 && p
20e30 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  B==0 ) return 0;
20e40 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
20e50 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  pB==0 ) return 1
20e60 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70  ;.  if( pA->nExp
20e70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72  r!=pB->nExpr ) r
20e80 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69  eturn 1;.  for(i
20e90 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b  =0; i<pA->nExpr;
20ea0 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
20eb0 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b  *pExprA = pA->a[
20ec0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78  i].pExpr;.    Ex
20ed0 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d  pr *pExprB = pB-
20ee0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
20ef0 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f   if( pA->a[i].so
20f00 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69  rtOrder!=pB->a[i
20f10 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65  ].sortOrder ) re
20f20 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
20f30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
20f40 72 65 28 70 45 78 70 72 41 2c 20 70 45 78 70 72  re(pExprA, pExpr
20f50 42 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  B, iTab) ) retur
20f60 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
20f70 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
20f80 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20  turn true if we 
20f90 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70 45  can prove the pE
20fa0 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  2 will always be
20fb0 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73 0a   true if pE1 is.
20fc0 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e  ** true.  Return
20fd0 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61 6e   false if we can
20fe0 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68 65  not complete the
20ff0 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45 32   proof or if pE2
21000 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c   might.** be fal
21010 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  se.  Examples:.*
21020 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d  *.**     pE1: x=
21030 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  =5       pE2: x=
21040 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
21050 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
21060 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20 20     pE1: x>0     
21070 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
21080 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
21090 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
210a0 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70 45  1: x=21       pE
210b0 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33 20  2: x=21 OR y=43 
210c0 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
210d0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
210e0 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20 49  123     pE2: x I
210f0 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
21100 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
21110 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20 20    pE1: x!=?1    
21120 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
21130 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
21140 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
21150 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a   x IS NULL  pE2:
21160 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
21170 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
21180 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53  **     pE1: x IS
21190 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49 53   ?2    pE2: x IS
211a0 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 75   NOT NULL    Reu
211b0 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a  slt: false.**.**
211c0 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20   When comparing 
211d0 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
211e0 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64 20  between pE1 and 
211f0 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73 0a  pE2, if pE2 has.
21200 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c 30  ** Expr.iTable<0
21210 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20 74   then assume a t
21220 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76 65  able number give
21230 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  n by iTab..**.**
21240 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   When in doubt, 
21250 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52  return false.  R
21260 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69  eturning true mi
21270 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
21280 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76  rmance.** improv
21290 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e  ement.  Returnin
212a0 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61  g false might ca
212b0 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  use a performanc
212c0 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74  e reduction, but
212d0 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61  .** it will alwa
212e0 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72  ys give the corr
212f0 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69  ect answer and i
21300 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73  s hence always s
21310 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  afe..*/.int sqli
21320 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
21330 70 72 28 45 78 70 72 20 2a 70 45 31 2c 20 45 78  pr(Expr *pE1, Ex
21340 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61  pr *pE2, int iTa
21350 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  b){.  if( sqlite
21360 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31  3ExprCompare(pE1
21370 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30 20  , pE2, iTab)==0 
21380 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
21390 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e  .  }.  if( pE2->
213a0 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20  op==TK_OR.   && 
213b0 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c  (sqlite3ExprImpl
213c0 69 65 73 45 78 70 72 28 70 45 31 2c 20 70 45 32  iesExpr(pE1, pE2
213d0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20  ->pLeft, iTab). 
213e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
213f0 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
21400 73 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e  sExpr(pE1, pE2->
21410 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 0a  pRight, iTab) ).
21420 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
21430 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32  1;.  }.  if( pE2
21440 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
21450 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
21460 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2d 3e 70  prCompare(pE1->p
21470 4c 65 66 74 2c 20 70 45 32 2d 3e 70 4c 65 66 74  Left, pE2->pLeft
21480 2c 20 69 54 61 62 29 3d 3d 30 0a 20 20 20 26 26  , iTab)==0.   &&
21490 20 28 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53   (pE1->op!=TK_IS
214a0 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21  NULL && pE1->op!
214b0 3d 54 4b 5f 49 53 29 0a 20 20 29 7b 0a 20 20 20  =TK_IS).  ){.   
214c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
214d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
214e0 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
214f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
21500 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
21510 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77  ed by the tree w
21520 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e  alker.** to coun
21530 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  t references to 
21540 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  table columns in
21550 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f   the arguments o
21560 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61  f an .** aggrega
21570 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20  te function, in 
21580 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65  order to impleme
21590 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  nt the.** sqlite
215a0 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63  3FunctionThisSrc
215b0 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
215c0 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b  truct SrcCount {
215d0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
215e0 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69  ;   /* One parti
215f0 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73  cular FROM claus
21600 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75  e in a nested qu
21610 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68  ery */.  int nTh
21620 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  is;       /* Num
21630 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
21640 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
21650 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  pSrcList */.  in
21660 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f  t nOther;      /
21670 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
21680 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
21690 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20  s in other FROM 
216a0 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  clauses */.};../
216b0 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
216c0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
216d0 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a  ces to columns..
216e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
216f0 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65  prSrcCount(Walke
21700 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
21710 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54   *pExpr){.  /* T
21720 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68  he NEVER() on th
21730 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73  e second term is
21740 20 62 65 63 61 75 73 65 20 73 71 6c 69 74 65 33   because sqlite3
21750 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
21760 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c  Src().  ** is al
21770 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  ways called befo
21780 72 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  re sqlite3ExprAn
21790 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
217a0 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a  ) and so the.  *
217b0 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76  * TK_COLUMNs hav
217c0 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  e not yet been c
217d0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b  onverted into TK
217e0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66  _AGG_COLUMN.  If
217f0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e  .  ** sqlite3Fun
21800 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
21810 28 29 20 69 73 20 75 73 65 64 20 64 69 66 66 65  () is used diffe
21820 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75  rently in the fu
21830 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e  ture, the.  ** N
21840 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64  EVER() will need
21850 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20   to be removed. 
21860 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
21870 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
21880 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70   NEVER(pExpr->op
21890 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29  ==TK_AGG_COLUMN)
218a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
218b0 20 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75     struct SrcCou
218c0 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d  nt *p = pWalker-
218d0 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20  >u.pSrcCount;.  
218e0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
218f0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66  = p->pSrc;.    f
21900 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
21910 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
21920 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
21930 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e  ble==pSrc->a[i].
21940 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
21950 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
21960 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20  <pSrc->nSrc ){. 
21970 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b       p->nThis++;
21980 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21990 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20    p->nOther++;. 
219a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
219b0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
219c0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
219d0 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ne if any of the
219e0 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
219f0 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e  e pExpr Function
21a00 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53   reference.** pS
21a10 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  rcList.  Return 
21a20 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e  true if they do.
21a30 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72    Also return tr
21a40 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ue if the functi
21a50 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67  on.** has no arg
21a60 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e  uments or has on
21a70 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  ly constant argu
21a80 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66  ments.  Return f
21a90 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a  alse if pExpr.**
21aa0 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75   references colu
21ab0 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75  mns but not colu
21ac0 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f  mns of tables fo
21ad0 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e  und in pSrcList.
21ae0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
21af0 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
21b00 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  rc(Expr *pExpr, 
21b10 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
21b20 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
21b30 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
21b40 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  t cnt;.  assert(
21b50 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
21b60 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
21b70 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
21b80 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
21b90 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
21ba0 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77  xprSrcCount;.  w
21bb0 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26  .u.pSrcCount = &
21bc0 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20  cnt;.  cnt.pSrc 
21bd0 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e  = pSrcList;.  cn
21be0 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63  t.nThis = 0;.  c
21bf0 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20  nt.nOther = 0;. 
21c00 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
21c10 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e  List(&w, pExpr->
21c20 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  x.pList);.  retu
21c30 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c  rn cnt.nThis>0 |
21c40 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b  | cnt.nOther==0;
21c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
21c60 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
21c70 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  he pAggInfo->aCo
21c80 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  l[] array.  Retu
21c90 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
21ca0 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
21cb0 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
21cc0 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
21cd0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
21ce0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
21cf0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71  AggInfoColumn(sq
21d00 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
21d10 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
21d20 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43  t i;.  pInfo->aC
21d30 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  ol = sqlite3Arra
21d40 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
21d50 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e    db,.       pIn
21d60 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20  fo->aCol,.      
21d70 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
21d80 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  Col[0]),.       
21d90 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c  &pInfo->nColumn,
21da0 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
21db0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
21dc0 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e   ../*.** Add a n
21dd0 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
21de0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
21df0 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  c[] array.  Retu
21e00 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
21e10 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
21e20 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
21e30 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
21e40 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
21e50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
21e60 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69  AggInfoFunc(sqli
21e70 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
21e80 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
21e90 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  i;.  pInfo->aFun
21ea0 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  c = sqlite3Array
21eb0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
21ec0 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e   db, .       pIn
21ed0 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20  fo->aFunc,.     
21ee0 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
21ef0 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20  aFunc[0]),.     
21f00 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c    &pInfo->nFunc,
21f10 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
21f20 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
21f30 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
21f40 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61   the xExprCallba
21f50 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61  ck for a tree wa
21f60 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65  lker.  It is use
21f70 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  d to.** implemen
21f80 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  t sqlite3ExprAna
21f90 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
21fa0 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
21fb0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
21fc0 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
21fd0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
21fe0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
21ff0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
22000 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  e(Walker *pWalke
22010 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
22020 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
22030 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70  Context *pNC = p
22040 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
22050 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
22060 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
22070 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
22080 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
22090 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
220a0 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41  ggInfo = pNC->pA
220b0 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63  ggInfo;..  switc
220c0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
220d0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
220e0 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
220f0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
22100 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
22110 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
22120 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
22130 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
22140 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
22150 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ;.      /* Check
22160 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
22170 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20  olumn is in one 
22180 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
22190 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20   the FROM.      
221a0 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
221b0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
221c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
221d0 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30  WAYS(pSrcList!=0
221e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ) ){.        str
221f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
22200 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69   *pItem = pSrcLi
22210 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66  st->a;.        f
22220 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
22230 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
22240 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
22250 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
22260 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20  o_col *pCol;.   
22270 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
22280 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22290 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
222a0 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
222b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
222c0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
222d0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29  pItem->iCursor )
222e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
222f0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
22300 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
22310 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66  s that pExpr ref
22320 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20  ers to a table. 
22330 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
22340 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f  at is in the FRO
22350 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
22360 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
22370 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a    .            *
22380 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
22390 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   Make an entry f
223a0 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  or the column in
223b0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
223c0 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20  ] if there.     
223d0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
223e0 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20   an entry there 
223f0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20  already..       
22400 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22410 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
22420 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41         pCol = pA
22430 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20  ggInfo->aCol;.  
22440 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
22450 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; k<pAggInfo->n
22460 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f  Column; k++, pCo
22470 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
22480 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54      if( pCol->iT
22490 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
224a0 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
224b0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
224c0 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
224d0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
224e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
224f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
22500 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
22510 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
22520 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  k>=pAggInfo->nCo
22530 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20  lumn).          
22540 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67     && (k = addAg
22550 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  gInfoColumn(pPar
22560 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
22570 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ))>=0 .         
22580 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
22590 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67      pCol = &pAgg
225a0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20  Info->aCol[k];. 
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
225c0 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  l->pTab = pExpr-
225d0 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
225e0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c       pCol->iTabl
225f0 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  e = pExpr->iTabl
22600 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
22610 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pCol->iColumn =
22620 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
22630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
22640 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  Col->iMem = ++pP
22650 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
22660 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
22670 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
22680 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
22690 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20    pCol->pExpr = 
226a0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
226b0 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66       if( pAggInf
226c0 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  o->pGroupBy ){. 
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
226e0 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20  nt j, n;.       
226f0 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73           ExprLis
22700 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66  t *pGB = pAggInf
22710 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  o->pGroupBy;.   
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
22730 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
22740 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e  m *pTerm = pGB->
22750 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a;.             
22760 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70     n = pGB->nExp
22770 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
22780 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
22790 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65    Expr *pE = pTe
227c0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
227e0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pE->op==TK_COLU
227f0 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65  MN && pE->iTable
22800 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
22810 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
22820 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f           pE->iCo
22830 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
22840 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
22850 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
22860 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
22870 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
22880 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
228b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
228c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
228d0 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
228e0 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b  orterColumn<0 ){
228f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22900 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
22910 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d  lumn = pAggInfo-
22920 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b  >nSortingColumn+
22930 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
22940 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
22950 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
22960 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20  There is now an 
22970 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20  entry for pExpr 
22980 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
22990 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20  l[] (either.    
229a0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75          ** becau
229b0 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20  se it was there 
229c0 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73  before or becaus
229d0 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65  e we just create
229e0 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20  d it)..         
229f0 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68     ** Convert th
22a00 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20  e pExpr to be a 
22a10 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65  TK_AGG_COLUMN re
22a20 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a  ferring to that.
22a30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
22a40 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
22a50 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20  entry..         
22a60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
22a70 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
22a80 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
22a90 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
22aa0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
22ab0 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
22ac0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
22ad0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
22ae0 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
22af0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
22b00 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20   = (i16)k;.     
22b10 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22b20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
22b30 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
22b40 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
22b50 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
22b60 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
22b70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
22b80 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
22b90 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
22ba0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
22bb0 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
22bc0 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
22bd0 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46  lags & NC_InAggF
22be0 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  unc)==0.       &
22bf0 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65  & pWalker->walke
22c00 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f  rDepth==pExpr->o
22c10 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  p2.      ){.    
22c20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
22c30 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20  see if pExpr is 
22c40 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
22c50 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65  nother aggregate
22c60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e   .        ** fun
22c70 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c  ction that is al
22c80 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67  ready in the pAg
22c90 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  gInfo structure.
22ca0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
22cb0 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
22cc0 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20  o_func *pItem = 
22cd0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
22ce0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
22cf0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
22d00 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  unc; i++, pItem+
22d10 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
22d20 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
22d30 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  pare(pItem->pExp
22d40 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30  r, pExpr, -1)==0
22d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22d60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
22d70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
22d80 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
22d90 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
22da0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
22db0 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
22dc0 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
22dd0 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
22de0 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
22df0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
22e00 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
22e10 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
22e20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
22e30 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
22e40 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
22e50 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
22e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
22e70 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
22e80 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
22e90 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
22ea0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
22eb0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
22ec0 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
22ed0 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
22ee0 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
22ef0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
22f00 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22f10 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  m;.            a
22f20 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
22f30 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
22f40 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
22f50 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
22f60 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->pFunc = sqlite
22f70 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
22f80 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
22fa0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71  pr->u.zToken, sq
22fb0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45  lite3Strlen30(pE
22fc0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a  xpr->u.zToken),.
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fe0 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73     pExpr->x.pLis
22ff0 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t ? pExpr->x.pLi
23000 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65  st->nExpr : 0, e
23010 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
23020 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
23030 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
23040 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ct ){.          
23050 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
23060 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
23070 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
23080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23090 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
230a0 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
230b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
230c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
230d0 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   }.        /* Ma
230e0 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74  ke pExpr point t
230f0 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
23100 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
23110 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20  c[] entry.      
23120 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
23130 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
23140 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
23150 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
23160 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
23170 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
23180 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
23190 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
231a0 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
231b0 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70  i16)i;.        p
231c0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
231d0 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
231e0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
231f0 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  une;.      }else
23200 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
23210 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
23220 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23230 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
23240 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
23250 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
23260 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57  egatesInSelect(W
23270 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
23280 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
23290 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
232a0 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20  ETER(pWalker);. 
232b0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
232c0 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  R(pSelect);.  re
232d0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
232e0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  e;.}../*.** Anal
232f0 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78  yze the pExpr ex
23300 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
23310 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
23320 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
23330 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
23340 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
23350 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f  ded to AggInfo o
23360 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e  bject that pNC->
23370 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e  pAggInfo.** poin
23380 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e  ts to.  Addition
23390 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d  al entries are m
233a0 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e  ade on the AggIn
233b0 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20  fo object as.** 
233c0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
233d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
233e0 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
233f0 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
23400 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
23410 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
23420 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
23430 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  xprNames()..*/.v
23440 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
23450 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
23460 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
23470 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
23480 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
23490 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
234a0 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
234b0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
234c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
234d0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
234e0 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
234f0 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
23500 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
23510 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
23520 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
23530 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
23540 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
23550 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
23560 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
23570 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
23580 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
23590 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
235a0 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
235b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
235c0 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
235d0 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
235e0 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
235f0 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
23600 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
23610 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
23620 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
23630 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
23640 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
23650 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
23660 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
23670 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
23680 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
23690 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
236a0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
236b0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  em++){.      sql
236c0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
236d0 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
236e0 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
236f0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
23700 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67   Allocate a sing
23710 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20  le new register 
23720 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20  for use to hold 
23730 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74  some intermediat
23740 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74  e result..*/.int
23750 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
23760 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
23770 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
23780 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a  >nTempReg==0 ){.
23790 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
237a0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
237b0 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
237c0 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
237d0 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a  e->nTempReg];.}.
237e0 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
237f0 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61  e a register, ma
23800 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66  king available f
23810 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d  or reuse for som
23820 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f  e other.** purpo
23830 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  se..**.** If a r
23840 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65  egister is curre
23850 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20  ntly being used 
23860 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  by the column ca
23870 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  che, then.** the
23880 20 64 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20   dallocation is 
23890 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
238a0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
238b0 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a  line that uses.*
238c0 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62  * the register b
238d0 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f  ecomes stale..*/
238e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
238f0 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73  easeTempReg(Pars
23900 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
23910 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67  Reg){.  if( iReg
23920 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d   && pParse->nTem
23930 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
23940 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
23950 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
23960 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
23970 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  che *p;.    for(
23980 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
23990 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
239a0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
239b0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, p++){.      
239c0 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65  if( p->iReg==iRe
239d0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  g ){.        p->
239e0 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20  tempReg = 1;.   
239f0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
23a00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
23a10 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
23a20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
23a30 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  ++] = iReg;.  }.
23a40 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
23a50 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20  e or deallocate 
23a60 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20  a block of nReg 
23a70 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
23a80 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sters.*/.int sql
23a90 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
23aa0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23ab0 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
23ac0 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61   i, n;.  i = pPa
23ad0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a  rse->iRangeReg;.
23ae0 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52    n = pParse->nR
23af0 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e  angeReg;.  if( n
23b00 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73  Reg<=n ){.    as
23b10 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c  sert( !usedAsCol
23b20 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
23b30 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20   i, i+n-1) );.  
23b40 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
23b50 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
23b60 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
23b70 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
23b80 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
23b90 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
23ba0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
23bb0 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
23bc0 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
23bd0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
23be0 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
23bf0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
23c00 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69  nt nReg){.  sqli
23c10 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
23c20 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ve(pParse, iReg,
23c30 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52   nReg);.  if( nR
23c40 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
23c50 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
23c60 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
23c70 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
23c80 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
23c90 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
23ca0 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
23cb0 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
23cc0 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
23cd0 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  le for reuse..*/
23ce0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65  .void sqlite3Cle
23cf0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50  arTempRegCache(P
23d00 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
23d10 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
23d20 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
23d30 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
23d40 7d 0a                                            }.