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

Artifact 94d26c8e47bb25957e3963cc3d116b09ed8e12cd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0470: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0480: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0490: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
04a0: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
04b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
04c0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04d0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
04e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
04f0: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0500: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
0510: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
0520: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
0530: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
0540: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
0550: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
0560: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
0570: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54   if( op==TK_CAST
0580: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
0590: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
05a0: 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
05b0: 6c 75 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75  lue) );.    retu
05c0: 72 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  rn sqlite3Affini
05d0: 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e  tyType(pExpr->u.
05e0: 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 7d 0a  zToken, 0);.  }.
05f0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f 70  #endif.  if( (op
0600: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
0610: 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  || op==TK_COLUMN
0620: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53   || op==TK_REGIS
0630: 54 45 52 29 20 0a 20 20 20 26 26 20 70 45 78 70  TER) .   && pExp
0640: 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b 0a  r->pTab!=0.  ){.
0650: 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45      /* op==TK_RE
0660: 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d  GISTER && pExpr-
0670: 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73  >pTab!=0 happens
0680: 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20   when pExpr was 
0690: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 2a  originally.    *
06a0: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
06b0: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
06c0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
06d0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
06e0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  ter */.    int j
06f0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
0700: 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29  n;.    if( j<0 )
0710: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
0720: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
0730: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
0740: 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d 3e  Tab && j<pExpr->
0750: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
0760: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
0770: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66  pTab->aCol[j].af
0780: 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72 65  finity;.  }.  re
0790: 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69  turn pExpr->affi
07a0: 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  nity;.}../*.** S
07b0: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  et the collating
07c0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78   sequence for ex
07d0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74  pression pExpr t
07e0: 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  o be the collati
07f0: 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e  ng.** sequence n
0800: 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20  amed by pToken. 
0810: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
0820: 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72  er to a new Expr
0830: 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d   node that.** im
0840: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c  plements the COL
0850: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LATE operator..*
0860: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
0870: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
0880: 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66  r occurs, that f
0890: 61 63 74 20 69 73 20 72 65 63 6f 72 64 65 64 20  act is recorded 
08a0: 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a  in pParse->db.**
08b0: 20 61 6e 64 20 74 68 65 20 70 45 78 70 72 20 70   and the pExpr p
08c0: 61 72 61 6d 65 74 65 72 20 69 73 20 72 65 74 75  arameter is retu
08d0: 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a  rned unchanged..
08e0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
08f0: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f  ExprAddCollateTo
0900: 6b 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ken(.  Parse *pP
0910: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
0920: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0930: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
0940: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
0950: 20 2f 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c   /* Add the "COL
0960: 4c 41 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20  LATE" clause to 
0970: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
0980: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
0990: 20 2a 70 43 6f 6c 6c 4e 61 6d 65 20 20 20 2f 2a   *pCollName   /*
09a0: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   Name of collati
09b0: 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 29  ng sequence */.)
09c0: 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d  {.  if( pCollNam
09d0: 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78  e->n>0 ){.    Ex
09e0: 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
09f0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72  e3ExprAlloc(pPar
0a00: 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41  se->db, TK_COLLA
0a10: 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 31  TE, pCollName, 1
0a20: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
0a30: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ){.      pNew->p
0a40: 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Left = pExpr;.  
0a50: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
0a60: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50  |= EP_Collate|EP
0a70: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78  _Skip;.      pEx
0a80: 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
0a90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
0aa0: 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c  xpr;.}.Expr *sql
0ab0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0ac0: 74 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a  teString(Parse *
0ad0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0ae0: 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  xpr, const char 
0af0: 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b  *zC){.  Token s;
0b00: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30  .  assert( zC!=0
0b10: 20 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 43 3b 0a   );.  s.z = zC;.
0b20: 20 20 73 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    s.n = sqlite3S
0b30: 74 72 6c 65 6e 33 30 28 73 2e 7a 29 3b 0a 20 20  trlen30(s.z);.  
0b40: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
0b50: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
0b60: 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
0b70: 20 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   &s);.}../*.** S
0b80: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0b90: 43 4f 4c 4c 41 54 45 20 6f 72 20 54 4b 5f 41 53  COLLATE or TK_AS
0ba0: 20 6f 70 65 72 61 74 6f 72 73 20 61 6e 64 20 61   operators and a
0bb0: 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29 0a 2a 2a  ny unlikely().**
0bc0: 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29   or likelihood()
0bd0: 20 66 75 6e 63 74 69 6f 6e 20 61 74 20 74 68 65   function at the
0be0: 20 72 6f 6f 74 20 6f 66 20 61 6e 20 65 78 70 72   root of an expr
0bf0: 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20  ession..*/.Expr 
0c00: 2a 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70  *sqlite3ExprSkip
0c10: 43 6f 6c 6c 61 74 65 28 45 78 70 72 20 2a 70 45  Collate(Expr *pE
0c20: 78 70 72 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  xpr){.  while( p
0c30: 45 78 70 72 20 26 26 20 45 78 70 72 48 61 73 50  Expr && ExprHasP
0c40: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0c50: 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20 20 20 69  P_Skip) ){.    i
0c60: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
0c70: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e 6c  ty(pExpr, EP_Unl
0c80: 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  ikely) ){.      
0c90: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
0ca0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0cb0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
0cc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0cd0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
0ce0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20  Expr>0 );.      
0cf0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0d00: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
0d10: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
0d20: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
0d30: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
0d40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
0d50: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
0d60: 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 70 45  TK_COLLATE || pE
0d70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 29  xpr->op==TK_AS )
0d80: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
0d90: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
0da0: 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65 74    }.  }   .  ret
0db0: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a  urn pExpr;.}../*
0dc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
0dd0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0de0: 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
0df0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a  sion pExpr. If.*
0e00: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  * there is no de
0e10: 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20  fined collating 
0e20: 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e  sequence, return
0e30: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
0e40: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
0e50: 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74  nce might be det
0e60: 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c  ermined by a COL
0e70: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  LATE operator.**
0e80: 20 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65   or by the prese
0e90: 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  nce of a column 
0ea0: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63  with a defined c
0eb0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0ec0: 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70  e..** COLLATE op
0ed0: 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72  erators take fir
0ee0: 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20  st precedence.  
0ef0: 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61  Left operands ta
0f00: 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65  ke.** precedence
0f10: 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72   over right oper
0f20: 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  ands..*/.CollSeq
0f30: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c   *sqlite3ExprCol
0f40: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
0f50: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
0f60: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
0f70: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
0f80: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
0f90: 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20   0;.  Expr *p = 
0fa0: 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20  pExpr;.  while( 
0fb0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  p ){.    int op 
0fc0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28  = p->op;.    if(
0fd0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47   p->flags & EP_G
0fe0: 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a  eneric ) break;.
0ff0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1000: 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50  AST || op==TK_UP
1010: 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d  LUS ){.      p =
1020: 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20   p->pLeft;.     
1030: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1040: 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  .    if( op==TK_
1050: 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d  COLLATE || (op==
1060: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
1070: 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  ->op2==TK_COLLAT
1080: 45 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  E) ){.      pCol
1090: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
10a0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e  llSeq(pParse, EN
10b0: 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a  C(db), 0, p->u.z
10c0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
10d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
10e0: 66 28 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20  f( p->pTab!=0.  
10f0: 20 20 20 26 26 20 28 6f 70 3d 3d 54 4b 5f 41 47     && (op==TK_AG
1100: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
1110: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1120: 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45      || op==TK_RE
1130: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
1140: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 29 7b  _TRIGGER).    ){
1150: 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b  .      /* op==TK
1160: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
1170: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
1180: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
1190: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20  riginally.      
11a0: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
11b0: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
11c0: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
11d0: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
11e0: 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ster */.      in
11f0: 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  t j = p->iColumn
1200: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30  ;.      if( j>=0
1210: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
1220: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
1230: 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  p->pTab->aCol[j]
1240: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .zColl;.        
1250: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
1260: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
1270: 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30  NC(db), zColl, 0
1280: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12a0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
12b0: 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
12c0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
12d0: 70 2d 3e 70 4c 65 66 74 29 20 26 26 20 28 70 2d  p->pLeft) && (p-
12e0: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  >pLeft->flags & 
12f0: 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29  EP_Collate)!=0 )
1300: 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d  {.        p = p-
1310: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65  >pLeft;.      }e
1320: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d  lse{.        p =
1330: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20   p->pRight;.    
1340: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1350: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1360: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  }.  }.  if( sqli
1370: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
1380: 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29  pParse, pColl) )
1390: 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  { .    pColl = 0
13a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
13b0: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  Coll;.}../*.** p
13c0: 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61  Expr is an opera
13d0: 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73  nd of a comparis
13e0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66  on operator.  af
13f0: 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70  f2 is the.** typ
1400: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
1410: 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e  e other operand.
1420: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
1430: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79  eturns the.** ty
1440: 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  pe affinity that
1450: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1460: 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73  for the comparis
1470: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
1480: 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70  char sqlite3Comp
1490: 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72  areAffinity(Expr
14a0: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66   *pExpr, char af
14b0: 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31  f2){.  char aff1
14c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
14d0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
14e0: 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66   if( aff1 && aff
14f0: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68  2 ){.    /* Both
1500: 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f   sides of the co
1510: 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c  mparison are col
1520: 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73  umns. If one has
1530: 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20   numeric.    ** 
1540: 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68  affinity, use th
1550: 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73  at. Otherwise us
1560: 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20  e no affinity.. 
1570: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
1580: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
1590: 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20  finity(aff1) || 
15a0: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
15b0: 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20 29  Affinity(aff2) )
15c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15d0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
15e0: 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  C;.    }else{.  
15f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1600: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1610: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61  }.  }else if( !a
1620: 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a  ff1 && !aff2 ){.
1630: 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73      /* Neither s
1640: 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ide of the compa
1650: 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  rison is a colum
1660: 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a  n.  Compare the.
1670: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64      ** results d
1680: 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a  irectly..    */.
1690: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16a0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65  E_AFF_NONE;.  }e
16b0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20  lse{.    /* One 
16c0: 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  side is a column
16d0: 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e  , the other is n
16e0: 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75  ot. Use the colu
16f0: 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  mns affinity. */
1700: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66  .    assert( aff
1710: 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20  1==0 || aff2==0 
1720: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61  );.    return (a
1730: 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d  ff1 + aff2);.  }
1740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1750: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1760: 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72  operator.  Retur
1770: 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e  n the type affin
1780: 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ity that should.
1790: 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f  ** be applied to
17a0: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70   both operands p
17b0: 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68  rior to doing th
17c0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f  e comparison..*/
17d0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d  .static char com
17e0: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
17f0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1800: 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65  char aff;.  asse
1810: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
1820: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
1830: 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70  p==TK_IN || pExp
1840: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a  r->op==TK_LT ||.
1850: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1860: 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45  >op==TK_GT || pE
1870: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c  xpr->op==TK_GE |
1880: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1890: 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  LE ||.          
18a0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
18b0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
18c0: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
18d0: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
18e0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
18f0: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
1900: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1910: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
1920: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
1930: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
1940: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
1950: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1960: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
1970: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70  .  }else if( Exp
1980: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1990: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
19a0: 29 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  ) ){.    aff = s
19b0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
19c0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70  inity(pExpr->x.p
19d0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
19e0: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29  a[0].pExpr, aff)
19f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61  ;.  }else if( !a
1a00: 66 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ff ){.    aff = 
1a10: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1a20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
1a30: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  f;.}../*.** pExp
1a40: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
1a50: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67  n expression, eg
1a60: 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e  . '=', '<', IN(.
1a70: 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f  ..) etc..** idx_
1a80: 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20  affinity is the 
1a90: 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69  affinity of an i
1aa0: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52  ndexed column. R
1ab0: 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
1ac0: 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
1ad0: 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66  affinity idx_aff
1ae0: 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65  inity may be use
1af0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
1b00: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
1b10: 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e   in pExpr..*/.in
1b20: 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  t sqlite3IndexAf
1b30: 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70  finityOk(Expr *p
1b40: 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61  Expr, char idx_a
1b50: 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72  ffinity){.  char
1b60: 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f   aff = compariso
1b70: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
1b80: 3b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20  ;.  switch( aff 
1b90: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1ba0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20  TE_AFF_NONE:.   
1bb0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1bc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1bd0: 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74  _TEXT:.      ret
1be0: 75 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79  urn idx_affinity
1bf0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
1c00: 54 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  T;.    default:.
1c10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1c20: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1c30: 69 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69  inity(idx_affini
1c40: 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ty);.  }.}../*.*
1c50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20  * Return the P5 
1c60: 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c  value that shoul
1c70: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20  d be used for a 
1c80: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1c90: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f  n.** opcode (OP_
1ca0: 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20  Eq, OP_Ge etc.) 
1cb0: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
1cc0: 70 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72  pExpr1 and pExpr
1cd0: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  2..*/.static u8 
1ce0: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28  binaryCompareP5(
1cf0: 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78  Expr *pExpr1, Ex
1d00: 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20  pr *pExpr2, int 
1d10: 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75  jumpIfNull){.  u
1d20: 38 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71  8 aff = (char)sq
1d30: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1d40: 79 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66  y(pExpr2);.  aff
1d50: 20 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f   = (u8)sqlite3Co
1d60: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
1d70: 78 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38  xpr1, aff) | (u8
1d80: 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72  )jumpIfNull;.  r
1d90: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
1da0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1db0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
1dc0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
1dd0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1de0: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
1df0: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
1e00: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
1e10: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
1e20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
1e30: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
1e40: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
1e50: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
1e60: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
1e70: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
1e80: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1e90: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
1ea0: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
1eb0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
1ec0: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
1ed0: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
1ee0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
1ef0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
1f00: 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41  ** type..**.** A
1f10: 72 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28  rgument pRight (
1f20: 62 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d  but not pLeft) m
1f30: 61 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69  ay be a null poi
1f40: 6e 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61  nter. In this ca
1f50: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  se,.** it is not
1f60: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
1f70: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
1f80: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
1f90: 6c 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70  lSeq(.  Parse *p
1fa0: 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a  Parse, .  Expr *
1fb0: 70 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a  pLeft, .  Expr *
1fc0: 70 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c  pRight.){.  Coll
1fd0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73  Seq *pColl;.  as
1fe0: 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
1ff0: 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67   if( pLeft->flag
2000: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
2010: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
2020: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2030: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
2040: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
2050: 67 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e  ght && (pRight->
2060: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
2070: 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43  te)!=0 ){.    pC
2080: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2090: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
20a0: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
20b0: 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  e{.    pColl = s
20c0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
20d0: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
20e0: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
20f0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
2100: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2110: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
2120: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
2130: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
2140: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
2150: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
2160: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2180: 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50  codeCompare(.  P
2190: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
21a0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
21b0: 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61  (and code genera
21c0: 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f  ting) context */
21d0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
21e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
21f0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
2200: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
2210: 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65  /* The right ope
2220: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  rand */.  int op
2230: 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  code,       /* T
2240: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
2250: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  code */.  int in
2260: 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52  1, int in2, /* R
2270: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
2280: 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e  operands */.  in
2290: 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
22a0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
22b0: 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  true.  */.  int 
22c0: 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
22d0: 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69   If true, jump i
22e0: 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
22f0: 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
2300: 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61   int p5;.  int a
2310: 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ddr;.  CollSeq *
2320: 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69  p4;..  p4 = sqli
2330: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
2340: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2350: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
2360: 20 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d    p5 = binaryCom
2370: 70 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52  pareP5(pLeft, pR
2380: 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  ight, jumpIfNull
2390: 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  );.  addr = sqli
23a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50  te3VdbeAddOp4(pP
23b0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63  arse->pVdbe, opc
23c0: 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20  ode, in2, dest, 
23d0: 69 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  in1,.           
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 28 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f  (void*)p4, P4_CO
2400: 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65  LLSEQ);.  sqlite
2410: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50  3VdbeChangeP5(pP
2420: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38  arse->pVdbe, (u8
2430: 29 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  )p5);.  return a
2440: 64 64 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  ddr;.}..#if SQLI
2450: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
2460: 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  H>0./*.** Check 
2470: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48  that argument nH
2480: 65 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68  eight is less th
2490: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
24a0: 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78  he maximum.** ex
24b0: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61  pression depth a
24c0: 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73  llowed. If it is
24d0: 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65   not, leave an e
24e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a  rror message in.
24f0: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e  ** pParse..*/.in
2500: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
2510: 63 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a  ckHeight(Parse *
2520: 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69  pParse, int nHei
2530: 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ght){.  int rc =
2540: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
2550: 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61  t mxHeight = pPa
2560: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
2570: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
2580: 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20  R_DEPTH];.  if( 
2590: 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74  nHeight>mxHeight
25a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
25b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
25c0: 0a 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73  .       "Express
25d0: 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20  ion tree is too 
25e0: 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64  large (maximum d
25f0: 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69  epth %d)", mxHei
2600: 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ght.    );.    r
2610: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2620: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2630: 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c  c;.}../* The fol
2640: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
2650: 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66  ctions, heightOf
2660: 45 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66  Expr(), heightOf
2670: 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e  ExprList().** an
2680: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
2690: 28 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20  (), are used to 
26a0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61  determine the ma
26b0: 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20  ximum height.** 
26c0: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
26d0: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
26e0: 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  d by the structu
26f0: 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
2700: 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
2710: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
2720: 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  s maximum height
2730: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2740: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
2750: 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  ue pointed.** to
2760: 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68   by pnHeight, th
2770: 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
2780: 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e  er, then set *pn
2790: 48 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a  Height to that.*
27a0: 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  * value..*/.stat
27b0: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
27c0: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
27d0: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
27e0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
27f0: 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48   p->nHeight>*pnH
2800: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a  eight ){.      *
2810: 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48  pnHeight = p->nH
2820: 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  eight;.    }.  }
2830: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
2840: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
2850: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
2860: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
2870: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
2880: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
2890: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  i<p->nExpr; i++)
28a0: 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66  {.      heightOf
28b0: 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78  Expr(p->a[i].pEx
28c0: 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  pr, pnHeight);. 
28d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
28e0: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53  c void heightOfS
28f0: 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
2900: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
2910: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
2920: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
2930: 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74  pWhere, pnHeight
2940: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2950: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
2960: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
2970: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2980: 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29  Limit, pnHeight)
2990: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
29a0: 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70  pr(p->pOffset, p
29b0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
29c0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
29d0: 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67  ->pEList, pnHeig
29e0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
29f0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  fExprList(p->pGr
2a00: 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29  oupBy, pnHeight)
2a10: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2a20: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
2a30: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
2a40: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
2a50: 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48  t(p->pPrior, pnH
2a60: 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  eight);.  }.}../
2a70: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
2a80: 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62  r.nHeight variab
2a90: 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  le in the struct
2aa0: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e  ure passed as an
2ab0: 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41   .** argument. A
2ac0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  n expression wit
2ad0: 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45  h no children, E
2ae0: 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a  xpr.pList or .**
2af0: 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65   Expr.pSelect me
2b00: 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68  mber has a heigh
2b10: 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65  t of 1. Any othe
2b20: 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  r expression.** 
2b30: 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75  has a height equ
2b40: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
2b50: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
2b60: 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65  other .** refere
2b70: 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f  nced Expr plus o
2b80: 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ne..*/.static vo
2b90: 69 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74  id exprSetHeight
2ba0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
2bb0: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
2bc0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
2bd0: 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29  pLeft, &nHeight)
2be0: 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72  ;.  heightOfExpr
2bf0: 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65  (p->pRight, &nHe
2c00: 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70  ight);.  if( Exp
2c10: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
2c20: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
2c30: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c  .    heightOfSel
2c40: 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74  ect(p->x.pSelect
2c50: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , &nHeight);.  }
2c60: 65 6c 73 65 7b 0a 20 20 20 20 68 65 69 67 68 74  else{.    height
2c70: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e  OfExprList(p->x.
2c80: 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29  pList, &nHeight)
2c90: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67  ;.  }.  p->nHeig
2ca0: 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31  ht = nHeight + 1
2cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
2cc0: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
2cd0: 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74  variable using t
2ce0: 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  he exprSetHeight
2cf0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a  () function. If.
2d00: 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73  ** the height is
2d10: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
2d20: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
2d30: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  d expression dep
2d40: 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  th,.** leave an 
2d50: 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
2d60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d70: 45 78 70 72 53 65 74 48 65 69 67 68 74 28 50 61  ExprSetHeight(Pa
2d80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2d90: 72 20 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74  r *p){.  exprSet
2da0: 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c  Height(p);.  sql
2db0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
2dc0: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
2dd0: 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Height);.}../*.*
2de0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78  * Return the max
2df0: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
2e00: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
2e10: 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  ee referenced.**
2e20: 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73   by the select s
2e30: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
2e40: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
2e50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
2e60: 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53  lectExprHeight(S
2e70: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
2e80: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
2e90: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
2ea0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72  , &nHeight);.  r
2eb0: 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d  eturn nHeight;.}
2ec0: 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
2ed0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
2ee0: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
2ef0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
2f00: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
2f10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
2f20: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
2f30: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
2f40: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
2f50: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
2f60: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
2f70: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
2f80: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
2f90: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
2fa0: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
2fb0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
2fc0: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
2fd0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
2fe0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
2ff0: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
3000: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
3010: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
3020: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
3030: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
3040: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
3050: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
3060: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
3070: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
3080: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
3090: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
30a0: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
30b0: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 61  ting is performa
30c0: 6e 63 65 2e 20 20 54 68 65 20 64 65 51 75 6f 74  nce.  The deQuot
30d0: 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  e.** parameter i
30e0: 73 20 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f  s ignored if pTo
30f0: 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69  ken is NULL or i
3100: 66 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73  f the token does
3110: 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74   not.** appear t
3120: 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66  o be quoted.  If
3130: 20 74 68 65 20 71 75 6f 74 65 73 20 77 65 72 65   the quotes were
3140: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e   of the form "..
3150: 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65  ." (double-quote
3160: 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45  s).** then the E
3170: 50 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67  P_DblQuoted flag
3180: 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65   is set on the e
3190: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a  xpression node..
31a0: 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61  **.** Special ca
31b0: 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49  se:  If op==TK_I
31c0: 4e 54 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65  NTEGER and pToke
31d0: 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  n points to a st
31e0: 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e  ring that.** can
31f0: 20 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69   be translated i
3200: 6e 74 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74  nto a 32-bit int
3210: 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74  eger, then the t
3220: 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73  oken is not.** s
3230: 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65  tored in u.zToke
3240: 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65  n.  Instead, the
3250: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
3260: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
3270: 74 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20  to u.iValue and 
3280: 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
3290: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f  flag is set.  No
32a0: 20 65 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a   extra storage.*
32b0: 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74  * is allocated t
32c0: 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67  o hold the integ
32d0: 65 72 20 74 65 78 74 20 61 6e 64 20 74 68 65 20  er text and the 
32e0: 64 65 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20  dequote flag is 
32f0: 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72  ignored..*/.Expr
3300: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c   *sqlite3ExprAll
3310: 6f 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  oc(.  sqlite3 *d
3320: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
3330: 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69   Handle for sqli
3340: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
3350: 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20  ) (may be null) 
3360: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3380: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
3390: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  e */.  const Tok
33a0: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f  en *pToken,    /
33b0: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
33c0: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
33d0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
33e0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
33f0: 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65   True to dequote
3400: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
3410: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  New;.  int nExtr
3420: 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  a = 0;.  int iVa
3430: 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  lue = 0;..  if( 
3440: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  pToken ){.    if
3450: 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52  ( op!=TK_INTEGER
3460: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30   || pToken->z==0
3470: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  .          || sq
3480: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54  lite3GetInt32(pT
3490: 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65  oken->z, &iValue
34a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45  )==0 ){.      nE
34b0: 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e  xtra = pToken->n
34c0: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
34d0: 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20  ( iValue>=0 );. 
34e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20     }.  }.  pNew 
34f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
3500: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
3510: 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a  (Expr)+nExtra);.
3520: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
3530: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38    pNew->op = (u8
3540: 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  )op;.    pNew->i
3550: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  Agg = -1;.    if
3560: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
3570: 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20    if( nExtra==0 
3580: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
3590: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
35a0: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
35b0: 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
35c0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65  iValue;.      }e
35d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
35e0: 20 63 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   c;.        pNew
35f0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68  ->u.zToken = (ch
3600: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
3610: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
3620: 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54  oken->z!=0 || pT
3630: 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20  oken->n==0 );.  
3640: 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e        if( pToken
3650: 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65  ->n ) memcpy(pNe
3660: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f  w->u.zToken, pTo
3670: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
3680: 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  n);.        pNew
3690: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65  ->u.zToken[pToke
36a0: 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  n->n] = 0;.     
36b0: 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26     if( dequote &
36c0: 26 20 6e 45 78 74 72 61 3e 3d 33 20 0a 20 20 20  & nExtra>=3 .   
36d0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28 63            && ((c
36e0: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29   = pToken->z[0])
36f0: 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27  =='\'' || c=='"'
3700: 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d   || c=='[' || c=
3710: 3d 27 60 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='`') ){.       
3720: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
3730: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
3740: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
3750: 20 63 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e   c=='"' ) pNew->
3760: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51  flags |= EP_DblQ
3770: 75 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  uoted;.        }
3780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
3790: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
37a0: 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70  PR_DEPTH>0.    p
37b0: 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31  New->nHeight = 1
37c0: 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20  ;.#endif  .  }. 
37d0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
37e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
37f0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
3800: 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72   node from a zer
3810: 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b  o-terminated tok
3820: 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61  en that has.** a
3830: 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75  lready been dequ
3840: 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  oted..*/.Expr *s
3850: 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71  qlite3Expr(.  sq
3860: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
3870: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
3880: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
3890: 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62  locZero() (may b
38a0: 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  e null) */.  int
38b0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
38c0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
38d0: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
38e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65  onst char *zToke
38f0: 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  n      /* Token 
3900: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
3910: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
3920: 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20   Token x;.  x.z 
3930: 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20  = zToken;.  x.n 
3940: 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74  = zToken ? sqlit
3950: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65  e3Strlen30(zToke
3960: 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  n) : 0;.  return
3970: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
3980: 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29  c(db, op, &x, 0)
3990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63  ;.}../*.** Attac
39a0: 68 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  h subtrees pLeft
39b0: 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74   and pRight to t
39c0: 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f  he Expr node pRo
39d0: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f  ot..**.** If pRo
39e0: 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  ot==NULL that me
39f0: 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72  ans that a memor
3a00: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
3a10: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
3a20: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65  .** In that case
3a30: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62  , delete the sub
3a40: 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20  trees pLeft and 
3a50: 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20  pRight..*/.void 
3a60: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
3a70: 68 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c  hSubtrees(.  sql
3a80: 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72  ite3 *db,.  Expr
3a90: 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20   *pRoot,.  Expr 
3aa0: 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a  *pLeft,.  Expr *
3ab0: 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20  pRight.){.  if( 
3ac0: 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pRoot==0 ){.    
3ad0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
3ae0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
3af0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3b00: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
3b10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3b20: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
3b30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
3b40: 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( pRight ){.    
3b50: 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20    pRoot->pRight 
3b60: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
3b70: 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pRoot->flags |= 
3b80: 45 50 5f 43 6f 6c 6c 61 74 65 20 26 20 70 52 69  EP_Collate & pRi
3b90: 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  ght->flags;.    
3ba0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20  }.    if( pLeft 
3bb0: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
3bc0: 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLeft = pLeft;. 
3bd0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
3be0: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20  s |= EP_Collate 
3bf0: 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a  & pLeft->flags;.
3c00: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
3c10: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
3c20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
3c30: 6f 63 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64  ocate a Expr nod
3c40: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3c50: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3c60: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3c70: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3c80: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3c90: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3ca0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
3cb0: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
3cc0: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
3cd0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
3ce0: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
3cf0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
3d00: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
3d10: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3d20: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3d30: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
3d40: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3d50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3d60: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3d70: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3d80: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3d90: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3da0: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
3db0: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
3dc0: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
3dd0: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
3de0: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
3df0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
3e00: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
3e10: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
3e20: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
3e30: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
3e40: 41 4e 44 20 26 26 20 70 4c 65 66 74 20 26 26 20  AND && pLeft && 
3e50: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a  pRight ){.    /*
3e60: 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   Take advantage 
3e70: 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74  of short-circuit
3e80: 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74   false optimizat
3e90: 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20  ion for AND */. 
3ea0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
3eb0: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
3ec0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
3ed0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
3ee0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
3ef0: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
3f00: 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  op, pToken, 1);.
3f10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
3f20: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50  ttachSubtrees(pP
3f30: 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65  arse->db, p, pLe
3f40: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  ft, pRight);.  }
3f50: 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20  .  if( p ) {.   
3f60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
3f70: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
3f80: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
3f90: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3fa0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
3fb0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
3fc0: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
3fd0: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
3fe0: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
3ff0: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
4000: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
4010: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
4020: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
4030: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
4040: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
4050: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
4060: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
4070: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
4080: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
4090: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
40a0: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
40b0: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
40c0: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
40d0: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
40e0: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
40f0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
4100: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
4110: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
4120: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
4130: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
4140: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
4150: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
4160: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
4170: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
4180: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
4190: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
41a0: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
41b0: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
41c0: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
41d0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
41e0: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
41f0: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
4200: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
4210: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
4220: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
4230: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
4240: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
4250: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4260: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
4270: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
4280: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
4290: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
42a0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
42b0: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
42c0: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
42d0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
42e0: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
42f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4300: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
4310: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
4320: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
4330: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
4340: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
4350: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
4360: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
4370: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
4380: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
4390: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
43a0: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
43b0: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
43c0: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
43d0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
43e0: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
43f0: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
4400: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
4410: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
4420: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
4430: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
4440: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
4450: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
4460: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
4470: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
4480: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
4490: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
44a0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
44b0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
44c0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
44d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
44e0: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
44f0: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
4500: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
4510: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
4520: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
4530: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
4540: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
4550: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4560: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4570: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
4580: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4590: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
45a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
45b0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
45c0: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
45d0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
45e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
45f0: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
4600: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
4610: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
4620: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
4630: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
4640: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
4650: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
4660: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
4670: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
4680: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
4690: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
46a0: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
46b0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
46c0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
46d0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  xprFunction(Pars
46e0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
46f0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
4700: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
4710: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69  pr *pNew;.  sqli
4720: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
4730: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
4740: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
4750: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
4760: 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54  loc(db, TK_FUNCT
4770: 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b  ION, pToken, 1);
4780: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
4790: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
47a0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
47b0: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
47c0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65   memory leak whe
47d0: 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  n malloc fails *
47e0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
47f0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c    }.  pNew->x.pL
4800: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61  ist = pList;.  a
4810: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
4820: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
4830: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
4840: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
4850: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e  eight(pParse, pN
4860: 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ew);.  return pN
4870: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
4880: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
4890: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
48a0: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
48b0: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
48c0: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
48d0: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
48e0: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
48f0: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
4900: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
4910: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
4920: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
4930: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
4940: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
4950: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
4960: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
4970: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
4980: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
4990: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
49a0: 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f  ot too be to avo
49b0: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
49c0: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
49d0: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
49e0: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
49f0: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
4a00: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
4a10: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
4a20: 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61  rm ":aaa", "@aaa
4a30: 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65  ", or "$aaa" are
4a40: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61   assigned the sa
4a50: 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20  me number.** as 
4a60: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
4a70: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  tance of the sam
4a80: 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20  e wildcard.  Or 
4a90: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
4aa0: 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  irst.** instance
4ab0: 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
4ac0: 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  , the next seque
4ad0: 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75  nial variable nu
4ae0: 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67  mber is.** assig
4af0: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
4b00: 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61  ite3ExprAssignVa
4b10: 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70  rNumber(Parse *p
4b20: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
4b30: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
4b40: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
4b50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4b60: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
4b70: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
4b80: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
4b90: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
4ba0: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64  _IntValue|EP_Red
4bb0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
4bc0: 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70  y) );.  z = pExp
4bd0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61  r->u.zToken;.  a
4be0: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
4bf0: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30   assert( z[0]!=0
4c00: 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d   );.  if( z[1]==
4c10: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  0 ){.    /* Wild
4c20: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
4c30: 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68   "?".  Assign th
4c40: 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20  e next variable 
4c50: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73  number */.    as
4c60: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20  sert( z[0]=='?' 
4c70: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  );.    pExpr->iC
4c80: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28  olumn = (ynVar)(
4c90: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
4ca0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e  .  }else{.    yn
4cb0: 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75  Var x = 0;.    u
4cc0: 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  32 n = sqlite3St
4cd0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69  rlen30(z);.    i
4ce0: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
4cf0: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
4d00: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
4d10: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
4d20: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
4d30: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
4d40: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
4d50: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
4d60: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
4d70: 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d      int bOk = 0=
4d80: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26  =sqlite3Atoi64(&
4d90: 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53  z[1], &i, n-1, S
4da0: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
4db0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
4dc0: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
4dd0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
4de0: 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( i==0 );.      
4df0: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29  testcase( i==1 )
4e00: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
4e10: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
4e20: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
4e30: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20  IABLE_NUMBER]-1 
4e40: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
4e50: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
4e60: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4e70: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
4e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d  ;.      if( bOk=
4e90: 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64  =0 || i<1 || i>d
4ea0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4eb0: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
4ec0: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20  NUMBER] ){.     
4ed0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4ee0: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
4ef0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
4f00: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
4f10: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
4f20: 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b       db->aLimit[
4f30: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
4f40: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a  IABLE_NUMBER]);.
4f50: 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20          x = 0;. 
4f60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4f70: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
4f80: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
4f90: 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69  e->nVar = (int)i
4fa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
4fb0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  lse{.      /* Wi
4fc0: 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61  ldcards like ":a
4fd0: 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22  aa", "$aaa" or "
4fe0: 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  @aaa".  Reuse th
4ff0: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
5000: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
5010: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
5020: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
5030: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
5040: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a  the name.      *
5050: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
5060: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
5070: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
5080: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
5090: 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72    */.      ynVar
50a0: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
50b0: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56  0; i<pParse->nzV
50c0: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; i++){.      
50d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a    if( pParse->az
50e0: 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70  Var[i] && strcmp
50f0: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69  (pParse->azVar[i
5100: 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ],z)==0 ){.     
5110: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
5120: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
5130: 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  )i+1;.          
5140: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5160: 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45  f( x==0 ) x = pE
5170: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
5180: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
5190: 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >nVar);.    }.  
51a0: 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20    if( x>0 ){.   
51b0: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
51c0: 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20  >nzVar ){.      
51d0: 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20    char **a;.    
51e0: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44      a = sqlite3D
51f0: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61  bRealloc(db, pPa
5200: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69  rse->azVar, x*si
5210: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
5220: 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 20       if( a==0 ) 
5230: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f  return;  /* Erro
5240: 72 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75  r reported throu
5250: 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  gh db->mallocFai
5260: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  led */.        p
5270: 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61  Parse->azVar = a
5280: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
5290: 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61  (&a[pParse->nzVa
52a0: 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61 72 73 65  r], 0, (x-pParse
52b0: 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28  ->nzVar)*sizeof(
52c0: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20  a[0]));.        
52d0: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20  pParse->nzVar = 
52e0: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
52f0: 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c   if( z[0]!='?' |
5300: 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  | pParse->azVar[
5310: 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  x-1]==0 ){.     
5320: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5330: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  (db, pParse->azV
5340: 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20  ar[x-1]);.      
5350: 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b    pParse->azVar[
5360: 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62  x-1] = sqlite3Db
5370: 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e  StrNDup(db, z, n
5380: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5390: 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61  .  } .  if( !pPa
53a0: 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61  rse->nErr && pPa
53b0: 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c  rse->nVar>db->aL
53c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
53d0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
53e0: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
53f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5400: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
5410: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
5420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
5430: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
5440: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
5450: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5460: 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74  ExprDelete(sqlit
5470: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
5480: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
5490: 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69  eturn;.  /* Sani
54a0: 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74  ty check: Assert
54b0: 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c   that the IntVal
54c0: 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  ue is non-negati
54d0: 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  ve if it exists 
54e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  */.  assert( !Ex
54f0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5500: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
5510: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20   p->u.iValue>=0 
5520: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
5530: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5540: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
5550: 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20    /* The Expr.x 
5560: 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75  union is never u
5570: 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65 20  sed at the same 
5580: 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69  time as Expr.pRi
5590: 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ght */.    asser
55a0: 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  t( p->x.pList==0
55b0: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30   || p->pRight==0
55c0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   );.    sqlite3E
55d0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
55e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c  >pLeft);.    sql
55f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
5600: 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  b, p->pRight);. 
5610: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
5620: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d  operty(p, EP_Mem
5630: 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33  Token) ) sqlite3
5640: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
5650: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28  zToken);.    if(
5660: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
5670: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
5680: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
5690: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
56a0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29  b, p->x.pSelect)
56b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
56c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
56d0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
56e0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
56f0: 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48    }.  if( !ExprH
5700: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5710: 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  _Static) ){.    
5720: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5730: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
5740: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
5750: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
5760: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
5770: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
5780: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
5790: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
57a0: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
57b0: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
57c0: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
57d0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
57e0: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
57f0: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
5800: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
5810: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
5820: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
5830: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
5840: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
5850: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
5860: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
5870: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
5880: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
5890: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
58a0: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
58b0: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
58c0: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
58d0: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
58e0: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
58f0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
5900: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
5910: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
5920: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
5930: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5940: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
5950: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
5960: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
5970: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
5980: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5990: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
59a0: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
59b0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
59c0: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
59d0: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
59e0: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
59f0: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
5a00: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
5a10: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
5a20: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
5a30: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
5a40: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
5a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
5a90: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
5aa0: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
5ab0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
5ac0: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
5ad0: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
5ae0: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
5af0: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
5b00: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
5b10: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
5b20: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
5b30: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
5b40: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
5b50: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
5b60: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
5b70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
5b80: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
5b90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
5ba0: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
5bb0: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
5bc0: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
5bd0: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
5be0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
5bf0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
5c00: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
5c10: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
5c20: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
5c30: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
5c40: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
5c50: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
5c60: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
5c70: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
5c80: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
5c90: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
5ca0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
5cb0: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
5cc0: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
5cd0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
5ce0: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
5cf0: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
5d00: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
5d10: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
5d20: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
5d30: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
5d40: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
5d50: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
5d60: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
5d70: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
5d80: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
5d90: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
5da0: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
5db0: 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74   teh Expr object
5dc0: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
5dd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
5de0: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
5df0: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
5e00: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
5e10: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
5e20: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
5e30: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
5e40: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
5e50: 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63 65  copy of a reduce
5e60: 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  d expression.  I
5e70: 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a  t is only legal.
5e80: 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20 70  ** to reduce a p
5e90: 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73 69  ristine expressi
5ea0: 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65  on tree from the
5eb0: 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d   parser.  The im
5ec0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  plementation.** 
5ed0: 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72 75  of dupedExprStru
5ee0: 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e  ctSize() contain
5ef0: 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74   multiple assert
5f00: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  () statements th
5f10: 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  at attempt.** to
5f20: 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f   enforce this co
5f30: 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61  nstraint..*/.sta
5f40: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
5f50: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
5f60: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
5f70: 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20  .  int nSize;.  
5f80: 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45  assert( flags==E
5f90: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c  XPRDUP_REDUCE ||
5fa0: 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20   flags==0 ); /* 
5fb0: 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61  Only one flag va
5fc0: 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20  lue allowed */. 
5fd0: 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46 55   assert( EXPR_FU
5fe0: 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b  LLSIZE<=0xfff );
5ff0: 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66 66  .  assert( (0xff
6000: 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  f & (EP_Reduced|
6010: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d  EP_TokenOnly))==
6020: 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 28 66  0 );.  if( 0==(f
6030: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
6040: 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a  UCE) ){.    nSiz
6050: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
6060: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
6070: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
6080: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
6090: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
60a0: 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ced) );.    asse
60b0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
60c0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
60d0: 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73  oin) ); .    ass
60e0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
60f0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
6100: 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73  oken) );.    ass
6110: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
6120: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
6130: 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28  duce) );.    if(
6140: 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e   p->pLeft || p->
6150: 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  x.pList ){.     
6160: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45   nSize = EXPR_RE
6170: 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52  DUCEDSIZE | EP_R
6180: 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73  educed;.    }els
6190: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
61a0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
61b0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
61c0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
61d0: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
61e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
61f0: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
6200: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6210: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
6220: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
6230: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
6240: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
6250: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
6260: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
6270: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
6280: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
6290: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
62a0: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
62b0: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
62c0: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
62d0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
62e0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
62f0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
6300: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
6310: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
6320: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6330: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
6340: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
6350: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
6360: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
6370: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
6380: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
6390: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
63a0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
63b0: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
63c0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
63d0: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
63e0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
63f0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
6400: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
6410: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6420: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
6430: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
6440: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
6450: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
6460: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
6470: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
6480: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
6490: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
64a0: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
64b0: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
64c0: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
64d0: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
64e0: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
64f0: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
6500: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
6510: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
6520: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
6530: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
6540: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
6550: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
6560: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
6570: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
6580: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
6590: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
65a0: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
65b0: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
65c0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
65d0: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
65e0: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
65f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
6600: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
6610: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
6620: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
6630: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
6640: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
6650: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
6660: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
6670: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
6680: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
6690: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
66a0: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
66b0: 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53  gs) + dupedExprS
66c0: 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66  ize(p->pRight, f
66d0: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
66e0: 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b  .  return nByte;
66f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
6700: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
6710: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ar to sqlite3Exp
6720: 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74  rDup(), except t
6730: 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20  hat if pzBuffer 
6740: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  .** is not NULL 
6750: 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69  then *pzBuffer i
6760: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
6770: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c  nt to a buffer l
6780: 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20  arge enough .** 
6790: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
67a0: 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
67b0: 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  p, the copies of
67c0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20   p->u.zToken.** 
67d0: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
67e0: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
67f0: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
6800: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
6810: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
6820: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
6830: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
6840: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
6850: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65  first byte passe
6860: 64 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  d the.** portion
6870: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
6880: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
6890: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
68a0: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
68b0: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
68c0: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
68d0: 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66  lags, u8 **pzBuf
68e0: 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  fer){.  Expr *pN
68f0: 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6910: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
6920: 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  */.  if( p ){.  
6930: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65    const int isRe
6940: 64 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45  duced = (flags&E
6950: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
6960: 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a      u8 *zAlloc;.
6970: 20 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c      u32 staticFl
6980: 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  ag = 0;..    ass
6990: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
69a0: 20 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b   || isReduced );
69b0: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
69c0: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
69d0: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
69e0: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
69f0: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
6a00: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6a10: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
6a20: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
6a30: 50 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65  P_Static;.    }e
6a40: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  lse{.      zAllo
6a50: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
6a60: 6c 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64  locRaw(db, duped
6a70: 45 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67  ExprSize(p, flag
6a80: 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  s));.    }.    p
6a90: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
6aa0: 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70  lloc;..    if( p
6ab0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  New ){.      /* 
6ac0: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
6ad0: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
6ae0: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
6af0: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
6b00: 20 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77        ** by pNew
6b10: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
6b20: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
6b30: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6b40: 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50   or.      ** EXP
6b50: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
6b60: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
6b70: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
6b80: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
6b90: 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63       ** by the c
6ba0: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
6bb0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
6bc0: 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
6bd0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
6be0: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
6bf0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
6c00: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
6c10: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  );.      const i
6c20: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
6c30: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
6c40: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  f;.      int nTo
6c50: 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ken;.      if( !
6c60: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6c70: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
6c80: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
6c90: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6ca0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6cb0: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
6cc0: 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  + 1;.      }else
6cd0: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6ce0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6cf0: 20 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65      if( isReduce
6d00: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
6d10: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
6d20: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
6d30: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
6d40: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
6d50: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
6d60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6d70: 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20      int nSize = 
6d80: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
6d90: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
6da0: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69  y(zAlloc, p, nSi
6db0: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze);.        mem
6dc0: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
6dd0: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
6de0: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
6df0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
6e00: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
6e10: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
6e20: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
6e30: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
6e40: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ly. */.      pNe
6e50: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
6e60: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
6e70: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c  nOnly|EP_Static|
6e80: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20  EP_MemToken);.  
6e90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
6ea0: 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26  |= nStructSize &
6eb0: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
6ec0: 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20  TokenOnly);.    
6ed0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6ee0: 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20   staticFlag;..  
6ef0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
6f00: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
6f10: 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ng, if any. */. 
6f20: 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20       if( nToken 
6f30: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
6f40: 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e  *zToken = pNew->
6f50: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
6f60: 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69  *)&zAlloc[nNewSi
6f70: 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze];.        mem
6f80: 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75  cpy(zToken, p->u
6f90: 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  .zToken, nToken)
6fa0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6fb0: 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61   if( 0==((p->fla
6fc0: 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20  gs|pNew->flags) 
6fd0: 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  & EP_TokenOnly) 
6fe0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ){.        /* Fi
6ff0: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
7000: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
7010: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
7020: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  r. */.        if
7030: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
7040: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
7050: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
7060: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
7070: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
7080: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  up(db, p->x.pSel
7090: 65 63 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b  ect, isReduced);
70a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
70b0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
70c0: 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  x.pList = sqlite
70d0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
70e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52   p->x.pList, isR
70f0: 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20  educed);.       
7100: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
7110: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
7120: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
7130: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
7140: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
7150: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
7160: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
7170: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
7180: 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65    zAlloc += dupe
7190: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
71a0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20   flags);.       
71b0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
71c0: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
71d0: 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20  duced) ){.      
71e0: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
71f0: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
7200: 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f  >pLeft, EXPRDUP_
7210: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
7220: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
7230: 2d 3e 70 52 69 67 68 74 20 3d 20 65 78 70 72 44  ->pRight = exprD
7240: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
7250: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
7260: 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  , &zAlloc);.    
7270: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
7280: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
7290: 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65          *pzBuffe
72a0: 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20  r = zAlloc;.    
72b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
72c0: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  e{.        if( !
72d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
72e0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
72f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
7300: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
7310: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7320: 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
7330: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
7340: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
7350: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
7360: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
7370: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d  }.      }..    }
7380: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
7390: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ew;.}../*.** Cre
73a0: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
73b0: 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68   deep copy of th
73c0: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
73d0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  as the second .*
73e0: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61  * argument. If a
73f0: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  n OOM condition 
7400: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
7410: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
7420: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e  .** and the db->
7430: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
7440: 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  g set..*/.#ifnde
7450: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
7460: 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77  E.static With *w
7470: 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ithDup(sqlite3 *
7480: 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20  db, With *p){.  
7490: 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a  With *pRet = 0;.
74a0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
74b0: 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
74c0: 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70  f(*p) + sizeof(p
74d0: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43  ->a[0]) * (p->nC
74e0: 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20  te-1);.    pRet 
74f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7500: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
7510: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29  ;.    if( pRet )
7520: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
7530: 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20       pRet->nCte 
7540: 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20  = p->nCte;.     
7550: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7560: 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
7570: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53     pRet->a[i].pS
7580: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
7590: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
75a0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29  a[i].pSelect, 0)
75b0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
75c0: 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c  a[i].pCols = sql
75d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
75e0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c  db, p->a[i].pCol
75f0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  s, 0);.        p
7600: 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  Ret->a[i].zName 
7610: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
7620: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  p(db, p->a[i].zN
7630: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
7640: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7650: 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23   pRet;.}.#else.#
7660: 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28   define withDup(
7670: 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  x,y) 0.#endif../
7680: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
7690: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
76a0: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
76b0: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
76c0: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
76d0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
76e0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
76f0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
7700: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
7710: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
7720: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
7730: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
7740: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
7750: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
7760: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
7770: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
7780: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
7790: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
77a0: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
77b0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
77c0: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
77d0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
77e0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
77f0: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
7800: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
7810: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
7820: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
7830: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
7840: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
7850: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
7860: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
7870: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
7880: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
7890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
78a0: 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
78b0: 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69  ains a combinati
78c0: 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55  on of the EXPRDU
78d0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20  P_XXX flags..** 
78e0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
78f0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
7900: 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75  t, then the stru
7910: 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69  cture returned i
7920: 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64  s a.** truncated
7930: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
7940: 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63  usual Expr struc
7950: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
7960: 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70  e stored as.** p
7970: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  art of the in-me
7980: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
7990: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
79a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45  ase schema..*/.E
79b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
79c0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
79d0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
79e0: 61 67 73 29 7b 0a 20 20 72 65 74 75 72 6e 20 65  ags){.  return e
79f0: 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c  xprDup(db, p, fl
7a00: 61 67 73 2c 20 30 29 3b 0a 7d 0a 45 78 70 72 4c  ags, 0);.}.ExprL
7a10: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
7a20: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
7a30: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
7a40: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7a50: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
7a60: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
7a70: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
7a80: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
7a90: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
7aa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7ab0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7ac0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
7ad0: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
7ae0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
7af0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78  n 0;.  pNew->nEx
7b00: 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70  pr = i = p->nExp
7b10: 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  r;.  if( (flags 
7b20: 26 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  & EXPRDUP_REDUCE
7b30: 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b 20  )==0 ) for(i=1; 
7b40: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69  i<p->nExpr; i+=i
7b50: 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  ){}.  pNew->a = 
7b60: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44  pItem = sqlite3D
7b70: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20  bMallocRaw(db,  
7b80: 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  i*sizeof(p->a[0]
7b90: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
7ba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
7bb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
7bc0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
7bd0: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
7be0: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
7bf0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
7c00: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
7c10: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
7c20: 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d  Expr *pOldExpr =
7c30: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
7c40: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
7c50: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
7c60: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
7c70: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49  , flags);.    pI
7c80: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
7c90: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7ca0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
7cb0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
7cc0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
7cd0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7ce0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
7cf0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
7d00: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
7d10: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
7d20: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
7d30: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
7d40: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
7d50: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
7d60: 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74  Item->u = pOldIt
7d70: 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74  em->u;.  }.  ret
7d80: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
7d90: 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74  ** If cursors, t
7da0: 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61  riggers, views a
7db0: 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72  nd subqueries ar
7dc0: 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72  e all omitted fr
7dd0: 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c  om.** the build,
7de0: 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68   then none of th
7df0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
7e00: 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ines, except for
7e10: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65   .** sqlite3Sele
7e20: 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20  ctDup(), can be 
7e30: 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53  called. sqlite3S
7e40: 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f  electDup() is so
7e50: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65  metimes.** calle
7e60: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72  d with a NULL ar
7e70: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21  gument..*/.#if !
7e80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7e90: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
7ea0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7eb0: 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c  T_TRIGGER) \. ||
7ec0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7ed0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
7ee0: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
7ef0: 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74  SrcListDup(sqlit
7f00: 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
7f10: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7f20: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
7f30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7f40: 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d  nByte;.  if( p==
7f50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7f60: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
7f70: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
7f80: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
7f90: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
7fa0: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
7fb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7fc0: 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  w(db, nByte );. 
7fd0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
7fe0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
7ff0: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
8000: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
8010: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8020: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
8030: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
8040: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
8050: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
8060: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
8070: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
8080: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
8090: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
80a0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pNewItem->pSchem
80b0: 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  a = pOldItem->pS
80c0: 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49  chema;.    pNewI
80d0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
80e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
80f0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8100: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
8110: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
8120: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8130: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8140: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
8150: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
8160: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
8170: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  , pOldItem->zAli
8180: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
8190: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f  m->jointype = pO
81a0: 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ldItem->jointype
81b0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
81c0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
81d0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
81e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46   pNewItem->addrF
81f0: 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65  illSub = pOldIte
8200: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a  m->addrFillSub;.
8210: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65      pNewItem->re
8220: 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74  gReturn = pOldIt
8230: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
8240: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 43     pNewItem->isC
8250: 6f 72 72 65 6c 61 74 65 64 20 3d 20 70 4f 6c 64  orrelated = pOld
8260: 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
8270: 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ed;.    pNewItem
8280: 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  ->viaCoroutine =
8290: 20 70 4f 6c 64 49 74 65 6d 2d 3e 76 69 61 43 6f   pOldItem->viaCo
82a0: 72 6f 75 74 69 6e 65 3b 0a 20 20 20 20 70 4e 65  routine;.    pNe
82b0: 77 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69  wItem->isRecursi
82c0: 76 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  ve = pOldItem->i
82d0: 73 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20  sRecursive;.    
82e0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  pNewItem->zIndex
82f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
8300: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8310: 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 70 4e  >zIndex);.    pN
8320: 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78  ewItem->notIndex
8330: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6e  ed = pOldItem->n
8340: 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20 20 70  otIndexed;.    p
8350: 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20  NewItem->pIndex 
8360: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 6e 64  = pOldItem->pInd
8370: 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  ex;.    pTab = p
8380: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
8390: 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pOldItem->pTab;.
83a0: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
83b0: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
83c0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ++;.    }.    pN
83d0: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
83e0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
83f0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8400: 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29  >pSelect, flags)
8410: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8420: 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pOn = sqlite3Exp
8430: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8440: 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a  m->pOn, flags);.
8450: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
8460: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64  sing = sqlite3Id
8470: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
8480: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
8490: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c     pNewItem->col
84a0: 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Used = pOldItem-
84b0: 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20  >colUsed;.  }.  
84c0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49  return pNew;.}.I
84d0: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
84e0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
84f0: 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b  *db, IdList *p){
8500: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
8510: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
8520: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
8530: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
8540: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8550: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
8560: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
8570: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
8580: 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64  ew->nId = p->nId
8590: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
85a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
85b0: 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  (db, p->nId*size
85c0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
85d0: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
85e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
85f0: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
8600: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8610: 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  }.  /* Note that
8620: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a   because the siz
8630: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
8640: 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69  ion for p->a[] i
8650: 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73  s not.  ** neces
8660: 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f  sarily a power o
8670: 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64  f two, sqlite3Id
8680: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79  ListAppend() may
8690: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20   not be called. 
86a0: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69   ** on the dupli
86b0: 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20  cate created by 
86c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  this function. *
86d0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
86e0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
86f0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
8700: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
8710: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
8720: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
8730: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
8740: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
8750: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
8760: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
8770: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
8780: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
8790: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
87a0: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
87b0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
87c0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
87d0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
87e0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
87f0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c  nt flags){.  Sel
8800: 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69  ect *pNew, *pPri
8810: 6f 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  or;.  if( p==0 )
8820: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
8830: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
8840: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
8850: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
8860: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
8870: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  0;.  pNew->pELis
8880: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
8890: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
88a0: 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  List, flags);.  
88b0: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
88c0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
88d0: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
88e0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  s);.  pNew->pWhe
88f0: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
8900: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  Dup(db, p->pWher
8910: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  e, flags);.  pNe
8920: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
8930: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
8940: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
8950: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8960: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
8970: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8980: 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73  ->pHaving, flags
8990: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
89a0: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
89b0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
89c0: 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29  pOrderBy, flags)
89d0: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
89e0: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
89f0: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20  rior = pPrior = 
8a00: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
8a10: 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
8a20: 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50  flags);.  if( pP
8a30: 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
8a40: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
8a50: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  New->pNext = 0;.
8a60: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
8a70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8a80: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66  db, p->pLimit, f
8a90: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
8aa0: 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33  Offset = sqlite3
8ab0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8ac0: 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a  Offset, flags);.
8ad0: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
8ae0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66   0;.  pNew->iOff
8af0: 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  set = 0;.  pNew-
8b00: 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73  >selFlags = p->s
8b10: 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73  elFlags & ~SF_Us
8b20: 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70  esEphemeral;.  p
8b30: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
8b40: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
8b50: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
8b60: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
8b70: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
8b80: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70  >nSelectRow;.  p
8b90: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74  New->pWith = wit
8ba0: 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74  hDup(db, p->pWit
8bb0: 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  h);.  return pNe
8bc0: 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  w;.}.#else.Selec
8bd0: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
8be0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
8bf0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
8c00: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
8c10: 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p==0 );.  retu
8c20: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
8c30: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
8c40: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
8c50: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
8c60: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
8c70: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
8c80: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
8c90: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
8ca0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
8cb0: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
8cc0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
8cd0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74   occurs, the ent
8ce0: 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65  ire list is free
8cf0: 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73  d and.** NULL is
8d00: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e   returned.  If n
8d10: 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  on-NULL is retur
8d20: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
8d30: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68  guaranteed.** th
8d40: 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  at the new entry
8d50: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
8d60: 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45  y appended..*/.E
8d70: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
8d80: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a  ExprListAppend(.
8d90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
8db0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
8dc0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8dd0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
8de0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
8df0: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
8e00: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
8e10: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
8e20: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
8e30: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
8e40: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
8e50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
8e60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8e70: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
8e80: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
8e90: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
8ea0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
8eb0: 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
8ec0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
8ed0: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
8ee0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
8ef0: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
8f00: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
8f10: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
8f20: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
8f30: 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  >a==0 ) goto no_
8f40: 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  mem;.  }else if(
8f50: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26   (pList->nExpr &
8f60: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31   (pList->nExpr-1
8f70: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ))==0 ){.    str
8f80: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
8f90: 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74  m *a;.    assert
8fa0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
8fb0: 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   );.    a = sqli
8fc0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
8fd0: 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74   pList->a, pList
8fe0: 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66  ->nExpr*2*sizeof
8ff0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
9000: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
9010: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
9020: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
9030: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20  st->a = a;.  }. 
9040: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
9050: 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20  a!=0 );.  if( 1 
9060: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
9070: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
9080: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
9090: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a  List->nExpr++];.
90a0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d      memset(pItem
90b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
90c0: 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  em));.    pItem-
90d0: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
90e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
90f0: 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20  st;..no_mem:    
9100: 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61   .  /* Avoid lea
9110: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d  king memory if m
9120: 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64  alloc has failed
9130: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  . */.  sqlite3Ex
9140: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
9150: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
9160: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
9170: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
9180: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
9190: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
91a0: 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74  [].zName element
91b0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
91c0: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
91d0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
91e0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
91f0: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
9200: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
9210: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
9220: 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20  ut pName should 
9230: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
9240: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
9250: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
9260: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
9270: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
9280: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
9290: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
92a0: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20  rListSetName(.  
92b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
92c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
92d0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
92e0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
92f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
9300: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
9310: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54  the span. */.  T
9320: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
9330: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74         /* Name t
9340: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20  o be added */.  
9350: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
9360: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
9370: 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d  to cause the nam
9380: 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64  e to be dequoted
9390: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
93a0: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61   pList!=0 || pPa
93b0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
93c0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
93d0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
93e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
93f0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
9400: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
9410: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49  Expr>0 );.    pI
9420: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
9430: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
9440: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
9450: 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a  em->zName==0 );.
9460: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
9470: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
9480: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
9490: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
94a0: 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71  >n);.    if( deq
94b0: 75 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a  uote && pItem->z
94c0: 4e 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65  Name ) sqlite3De
94d0: 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  quote(pItem->zNa
94e0: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  me);.  }.}../*.*
94f0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
9500: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65  st.a[].zSpan ele
9510: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
9520: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
9530: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
9540: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
9550: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
9560: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
9570: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
9580: 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f  .  But pSpan sho
9590: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
95a0: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
95b0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
95c0: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
95d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
95e0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
95f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9600: 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e  3ExprListSetSpan
9610: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9620: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
9630: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
9640: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
9650: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
9660: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
9670: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
9680: 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70  .  ExprSpan *pSp
9690: 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  an         /* Th
96a0: 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64  e span to be add
96b0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ed */.){.  sqlit
96c0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
96d0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
96e0: 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  List!=0 || db->m
96f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
9700: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
9710: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
9720: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
9730: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
9740: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
9750: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
9760: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
9770: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
9780: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65  ocFailed || pIte
9790: 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d  m->pExpr==pSpan-
97a0: 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71  >pExpr );.    sq
97b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
97c0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
97d0: 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20     pItem->zSpan 
97e0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
97f0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53  up(db, (char*)pS
9800: 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20  pan->zStart,.   
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45   (int)(pSpan->zE
9840: 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61  nd - pSpan->zSta
9850: 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rt));.  }.}../*.
9860: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
9870: 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74  sion list pEList
9880: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74   contains more t
9890: 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65  han iLimit eleme
98a0: 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e  nts,.** leave an
98b0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
98c0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69  n pParse..*/.voi
98d0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
98e0: 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20  tCheckLength(.  
98f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
9900: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
9910: 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t,.  const char 
9920: 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e  *zObject.){.  in
9930: 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64  t mx = pParse->d
9940: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
9950: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a  _LIMIT_COLUMN];.
9960: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
9970: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
9980: 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73  xpr==mx );.  tes
9990: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
99a0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
99b0: 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45  mx+1 );.  if( pE
99c0: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
99d0: 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20  nExpr>mx ){.    
99e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
99f0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
9a00: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22  y columns in %s"
9a10: 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a  , zObject);.  }.
9a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
9a30: 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73  an entire expres
9a40: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  sion list..*/.vo
9a50: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
9a60: 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
9a70: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
9a80: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
9a90: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
9aa0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
9ab0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
9ac0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
9ad0: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c  t( pList->a!=0 |
9ae0: 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  | pList->nExpr==
9af0: 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  0 );.  for(pItem
9b00: 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
9b10: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
9b20: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
9b30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
9b40: 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
9b50: 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
9b60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
9b70: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
9b80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9b90: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
9ba0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
9bb0: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
9bc0: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >a);.  sqlite3Db
9bd0: 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
9be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
9bf0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c  routines are Wal
9c00: 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20  ker callbacks.  
9c10: 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61  Walker.u.pi is a
9c20: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
9c30: 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73  n integer.  Thes
9c40: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  e routines are c
9c50: 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65  hecking an expre
9c60: 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20  ssion to see.** 
9c70: 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74  if it is a const
9c80: 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65  ant.  Set *Walke
9c90: 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74  r.u.pi to 0 if t
9ca0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9cb0: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74  .** not constant
9cc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
9cd0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
9ce0: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
9cf0: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
9d00: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
9d10: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
9d20: 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71  tant().**     sq
9d30: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
9d40: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20  antNotJoin().** 
9d50: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
9d60: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9d70: 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ion().**.*/.stat
9d80: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
9d90: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
9da0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
9db0: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
9dc0: 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69  f pWalker->u.i i
9dd0: 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 3 then any ter
9de0: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
9df0: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
9e00: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
9e10: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
9e20: 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75   of a join disqu
9e30: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
9e40: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
9e50: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
9e60: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
9e70: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   if( pWalker->u.
9e80: 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73 50  i==3 && ExprHasP
9e90: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
9ea0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
9eb0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20     pWalker->u.i 
9ec0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
9ed0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
9ee0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9ef0: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
9f00: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
9f10: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
9f20: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
9f30: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
9f40: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
9f50: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 75  ither pWalker->u
9f60: 2e 69 3d 3d 32 20 6f 72 20 74 68 65 20 66 75 6e  .i==2 or the fun
9f70: 63 74 69 6f 6e 20 61 73 20 74 68 65 20 53 51 4c  ction as the SQL
9f80: 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 0a 20  ITE_FUNC_CONST. 
9f90: 20 20 20 2a 2a 20 66 6c 61 67 2e 20 2a 2f 0a 20     ** flag. */. 
9fa0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
9fb0: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
9fc0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 7c  Walker->u.i==2 |
9fd0: 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
9fe0: 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74  y(pExpr,EP_Const
9ff0: 61 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ant) ){.        
a000: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
a010: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
a020: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
a030: 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
a040: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
a050: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
a060: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
a070: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
a080: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
a090: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
a0a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
a0b0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a0c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
a0d0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
a0e0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
a0f0: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
a100: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
a110: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
a120: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
a130: 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d  ;.      pWalker-
a140: 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20 20  >u.i = 0;.      
a150: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
a160: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
a170: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
a180: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
a190: 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  ECT ); /* select
a1a0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
a1b0: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
a1c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a1d0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
a1e0: 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63  ISTS ); /* selec
a1f0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20  tNodeIsConstant 
a200: 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f  will disallow */
a210: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
a220: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
a230: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  }.static int sel
a240: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
a250: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
a260: 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73  r, Select *NotUs
a270: 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
a280: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
a290: 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  ;.  pWalker->u.i
a2a0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
a2b0: 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74  RC_Abort;.}.stat
a2c0: 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e  ic int exprIsCon
a2d0: 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  st(Expr *p, int 
a2e0: 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c  initFlag){.  Wal
a2f0: 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
a300: 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
a310: 29 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69  );.  w.u.i = ini
a320: 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72  tFlag;.  w.xExpr
a330: 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
a340: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
a350: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
a360: 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49  ck = selectNodeI
a370: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c  sConstant;.  sql
a380: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
a390: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
a3a0: 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  u.i;.}../*.** Wa
a3b0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
a3c0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
a3d0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
a3e0: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
a3f0: 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e  * and 0 if it in
a400: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
a410: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
a420: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ls..**.** For th
a430: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
a440: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
a450: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
a460: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
a470: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
a480: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
a490: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
a4a0: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
a4b0: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
a4c0: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
a4d0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
a4e0: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  t(Expr *p){.  re
a4f0: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
a500: 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, 1);.}../*.**
a510: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
a520: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
a530: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
a540: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
a550: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
a560: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
a570: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
a580: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
a590: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
a5a0: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
a5b0: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
a5c0: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
a5d0: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
a5e0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
a5f0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
a600: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
a610: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
a620: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
a630: 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a  Const(p, 3);.}..
a640: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
a650: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
a660: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
a670: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
a680: 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
a690: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
a6a0: 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
a6b0: 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
a6c0: 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
a6d0: 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
a6e0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
a6f0: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
a700: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
a710: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
a720: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
a730: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
a740: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
a750: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
a760: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
a770: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
a780: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
a790: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a7a0: 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
a7b0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
a7c0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b  prIsConst(p, 2);
a7d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
a7e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
a7f0: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
a800: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
a810: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
a820: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
a830: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
a840: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
a850: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
a860: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
a870: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
a880: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
a890: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
a8a0: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
a8b0: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
a8c0: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
a8d0: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
a8e0: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
a8f0: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
a900: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
a910: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
a920: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e  t *pValue){.  in
a930: 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  t rc = 0;..  /* 
a940: 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  If an expression
a950: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c   is an integer l
a960: 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74 73  iteral that fits
a970: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
a980: 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  bit.  ** integer
a990: 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e  , then the EP_In
a9a0: 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c  tValue flag will
a9b0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
a9c0: 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65  en set */.  asse
a9d0: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  rt( p->op!=TK_IN
a9e0: 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61  TEGER || (p->fla
a9f0: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
aa00: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
aa10: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
aa20: 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  32(p->u.zToken, 
aa30: 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  &rc)==0 );..  if
aa40: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
aa50: 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
aa60: 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69  *pValue = p->u.i
aa70: 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72  Value;.    retur
aa80: 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n 1;.  }.  switc
aa90: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
aaa0: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
aab0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
aac0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
aad0: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
aae0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
aaf0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ab00: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
ab10: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
ab20: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
ab30: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
ab40: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
ab50: 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32    assert( v!=(-2
ab60: 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a  147483647-1) );.
ab70: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
ab80: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
ab90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
aba0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
abb0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
abc0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
abd0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
abe0: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
abf0: 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
ac00: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
ac10: 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c  ssion can be NUL
ac20: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
ac30: 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
ac40: 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   be NULL or if t
ac50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
ac60: 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20   too complex.** 
ac70: 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54  to tell return T
ac80: 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  RUE.  .**.** Thi
ac90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
aca0: 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  d as an optimiza
acb0: 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50  tion, to skip OP
acc0: 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a  _IsNull opcodes.
acd0: 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20  ** when we know 
ace0: 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e  that a value can
acf0: 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65  not be NULL.  He
ad00: 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73  nce, a false pos
ad10: 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e  itive.** (return
ad20: 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e  ing TRUE when in
ad30: 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73   fact the expres
ad40: 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62  sion can never b
ad50: 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a  e NULL) might.**
ad60: 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66   be a small perf
ad70: 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20  ormance hit but 
ad80: 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72  is otherwise har
ad90: 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f  mless.  On the o
ada0: 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20  ther.** hand, a 
adb0: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28  false negative (
adc0: 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20  returning FALSE 
add0: 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  when the result 
ade0: 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a  could be NULL).*
adf0: 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  * will likely re
ae00: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72  sult in an incor
ae10: 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f  rect answer.  So
ae20: 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   when in doubt, 
ae30: 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a  return.** TRUE..
ae40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
ae50: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73  prCanBeNull(cons
ae60: 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38  t Expr *p){.  u8
ae70: 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d   op;.  while( p-
ae80: 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
ae90: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
aea0: 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
aeb0: 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
aec0: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
aed0: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
aee0: 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
aef0: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
af00: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
af10: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
af20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
af30: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
af40: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
af50: 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54  rn 0;.    case T
af60: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  K_COLUMN:.      
af70: 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62 21  assert( p->pTab!
af80: 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  =0 );.      retu
af90: 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  rn p->iColumn>=0
afa0: 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f   && p->pTab->aCo
afb0: 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  l[p->iColumn].no
afc0: 74 4e 75 6c 6c 3d 3d 30 3b 0a 20 20 20 20 64 65  tNull==0;.    de
afd0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
afe0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
aff0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
b000: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
b010: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e  ression is a con
b020: 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c  stant which woul
b030: 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  d be.** unchange
b040: 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79  d by OP_Affinity
b050: 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69   with the affini
b060: 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ty given in the 
b070: 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
b080: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
b090: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
b0a0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
b0b0: 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
b0c0: 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  peration.** can 
b0d0: 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65  be omitted.  Whe
b0e0: 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72  n in doubt retur
b0f0: 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73  n FALSE.  A fals
b100: 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73  e negative.** is
b110: 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61   harmless.  A fa
b120: 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f  lse positive, ho
b130: 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c  wever, can resul
b140: 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a  t in the wrong.*
b150: 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74  * answer..*/.int
b160: 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
b170: 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
b180: 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c  e(const Expr *p,
b190: 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38   char aff){.  u8
b1a0: 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d   op;.  if( aff==
b1b0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
b1c0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68  ) return 1;.  wh
b1d0: 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
b1e0: 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  PLUS || p->op==T
b1f0: 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20  K_UMINUS ){ p = 
b200: 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70  p->pLeft; }.  op
b210: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20   = p->op;.  if( 
b220: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
b230: 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
b240: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
b250: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
b260: 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
b270: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
b280: 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
b290: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
b2a0: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
b2b0: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
b2c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
b2d0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
b2e0: 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  EAL || aff==SQLI
b2f0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
b300: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b310: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
b320: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
b330: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
b340: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b350: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72  _BLOB: {.      r
b360: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
b370: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
b380: 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  N: {.      asser
b390: 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20  t( p->iTable>=0 
b3a0: 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20  );  /* p cannot 
b3b0: 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45  be part of a CHE
b3c0: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  CK constraint */
b3d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
b3e0: 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20  >iColumn<0.     
b3f0: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
b400: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
b410: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
b420: 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20  AFF_NUMERIC);.  
b430: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
b440: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
b450: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
b460: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
b470: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
b480: 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
b490: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
b4a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
b4b0: 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
b4c0: 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
b4d0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
b4e0: 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
b4f0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
b500: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
b510: 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
b520: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
b530: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
b540: 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
b550: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
b560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b570: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
b580: 61 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f  able to the IN o
b590: 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61  perator optimiza
b5a0: 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65  tion on a.** que
b5b0: 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ry of the form.*
b5c0: 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20  *.**       x IN 
b5d0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a  (SELECT ...).**.
b5e0: 2a 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c  ** Where the SEL
b5f0: 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73  ECT... clause is
b600: 20 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79   as specified by
b610: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 74   the parameter t
b620: 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  o this.** routin
b630: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c  e..**.** The Sel
b640: 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ect object passe
b650: 64 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79  d in has already
b660: 20 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73   been preprocess
b670: 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72  ed and no.** err
b680: 6f 72 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f  ors have been fo
b690: 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  und..*/.#ifndef 
b6a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b6b0: 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20  UERY.static int 
b6c0: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
b6d0: 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Opt(Select *p){.
b6e0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
b6f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
b700: 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ist;.  Table *pT
b710: 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ab;.  if( p==0 )
b720: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b740: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
b750: 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20  of IN is SELECT 
b760: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
b770: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
b780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b790: 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
b7a0: 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
b7b0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
b7c0: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
b7d0: 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
b7e0: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
b7f0: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
b800: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
b810: 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
b820: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b830: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
b840: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
b850: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
b860: 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
b870: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
b880: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
b890: 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
b8a0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
b8b0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
b8c0: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b8e0: 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
b8f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
b900: 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
b910: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
b920: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
b930: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61  IT clause */.  a
b940: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
b950: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
b960: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49        /* No LIMI
b970: 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45  T means no OFFSE
b980: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57  T */.  if( p->pW
b990: 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9b0: 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
b9c0: 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
b9d0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
b9e0: 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
b9f0: 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
ba00: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
ba10: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
ba20: 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63  e term in FROM c
ba30: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
ba40: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
ba50: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
ba60: 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74    /* FROM is not
ba70: 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76   a subquery or v
ba80: 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  iew */.  pTab = 
ba90: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
baa0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 61  .  if( NEVER(pTa
bab0: 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  b==0) ) return 0
bac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
bad0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ->pSelect==0 ); 
bae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
baf0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  OM clause is not
bb00: 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28   a view */.  if(
bb10: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
bb20: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
bb30: 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
bb40: 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  se not a virtual
bb50: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69   table */.  pELi
bb60: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
bb70: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45    if( pEList->nE
bb80: 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
bb90: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  0;       /* One 
bba0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
bbb0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66  sult set */.  if
bbc0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ( pEList->a[0].p
bbd0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
bbe0: 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20  UMN ) return 0; 
bbf0: 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63  /* Result is a c
bc00: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72  olumn */.  retur
bc10: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
bc20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
bc30: 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  QUERY */../*.** 
bc40: 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20  Code an OP_Once 
bc50: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20  instruction and 
bc60: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
bc70: 6f 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74  or its flag. Ret
bc80: 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72  urn the .** addr
bc90: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
bca0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  nstruction..*/.i
bcb0: 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e  nt sqlite3CodeOn
bcc0: 63 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ce(Parse *pParse
bcd0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
bce0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
bcf0: 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56  arse);      /* V
bd00: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
bd10: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
bd20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
bd30: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f  beAddOp1(v, OP_O
bd40: 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e  nce, pParse->nOn
bd50: 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ce++);.}../*.** 
bd60: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
bd70: 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65  at checks the le
bd80: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
bd90: 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43  f index table iC
bda0: 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20  ur to see if.** 
bdb0: 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  it contains any 
bdc0: 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43  NULL entries.  C
bdd0: 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65  ause the registe
bde0: 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20  r at regHasNull 
bdf0: 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20  to be set.** to 
be00: 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
be10: 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
be20: 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75  s no NULLs.  Cau
be30: 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48  se register regH
be40: 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20  asNull.** to be 
be50: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69  set to NULL if i
be60: 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  Cur contains one
be70: 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
be80: 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
be90: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48  void sqlite3SetH
bea0: 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20  asNullFlag(Vdbe 
beb0: 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e  *v, int iCur, in
bec0: 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20  t regHasNull){. 
bed0: 20 69 6e 74 20 6a 31 3b 0a 20 20 73 71 6c 69 74   int j1;.  sqlit
bee0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bef0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
bf00: 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 6a 31  egHasNull);.  j1
bf10: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
bf20: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
bf30: 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f  d, iCur); VdbeCo
bf40: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
bf50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
bf60: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75  , OP_Column, iCu
bf70: 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
bf80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
bf90: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
bfa0: 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
bfb0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
bfc0: 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e   "first_entry_in
bfd0: 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20  (%d)", iCur));. 
bfe0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
bff0: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 7d 0a 0a  Here(v, j1);.}..
c000: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c010: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
c020: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
c030: 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
c040: 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28  or with a list (
c050: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
c060: 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74  on the .** right
c070: 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74  -hand side.  Ret
c080: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74  urn TRUE if that
c090: 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e   list is constan
c0a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
c0b0: 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43   sqlite3InRhsIsC
c0c0: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49  onstant(Expr *pI
c0d0: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53  n){.  Expr *pLHS
c0e0: 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61  ;.  int res;.  a
c0f0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
c100: 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f  roperty(pIn, EP_
c110: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
c120: 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66  pLHS = pIn->pLef
c130: 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20  t;.  pIn->pLeft 
c140: 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c  = 0;.  res = sql
c150: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
c160: 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e  nt(pIn);.  pIn->
c170: 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20  pLeft = pLHS;.  
c180: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65  return res;.}.#e
c190: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
c1a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
c1b0: 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
c1c0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
c1d0: 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  N (...) operator
c1e0: 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61  ..** The pX para
c1f0: 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70  meter is the exp
c200: 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52  ression on the R
c210: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
c220: 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20  rator, which.** 
c230: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
c240: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
c250: 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75  sions or a subqu
c260: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ery..**.** The j
c270: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
c280: 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ne is to find or
c290: 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
c2a0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e   object that can
c2b0: 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68  .** be used eith
c2c0: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
c2d0: 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65  embership in the
c2e0: 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69   RHS set or to i
c2f0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a  terate through.*
c300: 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  * all members of
c310: 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b   the RHS set, sk
c320: 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
c330: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f  s..**.** A curso
c340: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  r is opened on t
c350: 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
c360: 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53   that is the RHS
c370: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
c380: 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69  tor.** and pX->i
c390: 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
c3a0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
c3b0: 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t cursor..**.** 
c3c0: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
c3d0: 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
c3e0: 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68  ion indicates th
c3f0: 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61  e b-tree type, a
c400: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
c410: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49     IN_INDEX_ROWI
c420: 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72  D      - The cur
c430: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
c440: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
c450: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
c460: 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54  X_INDEX_ASC  - T
c470: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
c480: 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e  ened on an ascen
c490: 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
c4a0: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
c4b0: 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f  DESC - The curso
c4c0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
c4d0: 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
c4e0: 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
c4f0: 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54  X_EPH        - T
c500: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
c510: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
c520: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
c530: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c540: 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
c550: 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
c560: 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
c570: 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d  DEX_NOOP       -
c580: 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61   No cursor was a
c590: 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49  llocated.  The I
c5a0: 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20  N operator must 
c5b0: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d                im
c5d0: 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73  plemented as a s
c5e0: 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
c5f0: 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  risons..**.** An
c600: 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65   existing b-tree
c610: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69   might be used i
c620: 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73  f the RHS expres
c630: 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d  sion pX is a sim
c640: 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ple.** subquery 
c650: 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  such as:.**.**  
c660: 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
c670: 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  n> FROM <table>.
c680: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
c690: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
c6a0: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
c6b0: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
c6c0: 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
c6d0: 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
c6e0: 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
c6f0: 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
c700: 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
c710: 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
c720: 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
c730: 74 20 74 6f 20 74 68 65 20 65 70 68 65 72 6d 65  t to the epherme
c740: 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61  ral table instea
c750: 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74  d of an.** exist
c760: 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ing table..**.**
c770: 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72   The inFlags par
c780: 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74  ameter must cont
c790: 61 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ain exactly one 
c7a0: 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49  of the bits.** I
c7b0: 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
c7c0: 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c  IP or IN_INDEX_L
c7d0: 4f 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73  OOP.  If inFlags
c7e0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f   contains.** IN_
c7f0: 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
c800: 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72  , then the gener
c810: 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20  ated table will 
c820: 62 65 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a  be used for a.**
c830: 20 66 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70   fast membership
c840: 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65   test.  When the
c850: 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62   IN_INDEX_LOOP b
c860: 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a  it is set, the.*
c870: 2a 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20  * IN index will 
c880: 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20  be used to loop 
c890: 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
c8a0: 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  of the RHS of th
c8b0: 65 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72  e.** IN operator
c8c0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
c8d0: 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73  INDEX_LOOP is us
c8e0: 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
c8f0: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
c900: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
c910: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
c920: 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20  mbers) then the 
c930: 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20  b-tree must not 
c940: 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74  contain duplicat
c950: 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65  es..** An ephere
c960: 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62  mal table must b
c970: 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68  e used unless th
c980: 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75  e selected <colu
c990: 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65  mn> is guarantee
c9a0: 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75  d.** to be uniqu
c9b0: 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75  e - either becau
c9c0: 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45  se it is an INTE
c9d0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
c9e0: 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55  or it.** has a U
c9f0: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
ca00: 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78   or UNIQUE index
ca10: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
ca20: 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
ca30: 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
ca40: 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
ca50: 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
ca60: 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
ca70: 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e  p tests) then an
ca80: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
ca90: 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
caa0: 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
cab0: 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  > is an INTEGER 
cac0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61  PRIMARY KEY or a
cad0: 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20  n index can .** 
cae0: 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63  be found with <c
caf0: 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65  olumn> as its le
cb00: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a  ft-most column..
cb10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f  **.** If the IN_
cb20: 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e  INDEX_NOOP_OK an
cb30: 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  d IN_INDEX_MEMBE
cb40: 52 53 48 49 50 20 61 72 65 20 62 6f 74 68 20 73  RSHIP are both s
cb50: 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65  et and.** if the
cb60: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
cb70: 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
cb80: 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t (not a subquer
cb90: 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  y) then this.** 
cba0: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65  routine might de
cbb0: 63 69 64 65 20 74 68 61 74 20 63 72 65 61 74 69  cide that creati
cbc0: 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
cbd0: 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65  b-tree for membe
cbe0: 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67  rship.** testing
cbf0: 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76   is too expensiv
cc00: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f  e and return IN_
cc10: 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20  INDEX_NOOP.  In 
cc20: 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a  that case, the.*
cc30: 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
cc40: 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65  e should impleme
cc50: 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  nt the IN operat
cc60: 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71 75 65  or using a seque
cc70: 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20  nce.** of Eq or 
cc80: 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  Ne comparison op
cc90: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
cca0: 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  When the b-tree 
ccb0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  is being used fo
ccc0: 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
ccd0: 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ts, the calling 
cce0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68  function.** migh
ccf0: 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77  t need to know w
cd00: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
cd10: 65 20 52 48 53 20 73 69 64 65 20 6f 66 20 74 68  e RHS side of th
cd20: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
cd30: 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c   contains a NULL
cd40: 2e 20 20 49 66 20 70 72 52 68 73 48 61 73 4e 75  .  If prRhsHasNu
cd50: 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c  ll is not a NULL
cd60: 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a   pointer and .**
cd70: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
cd80: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
cd90: 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e   (...) might con
cda0: 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75  tain a NULL valu
cdb0: 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c  e at.** runtime,
cdc0: 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72   then a register
cdd0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
cde0: 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  d the register n
cdf0: 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a  umber written.**
ce00: 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c   to *prRhsHasNul
ce10: 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  l. If there is n
ce20: 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
ce30: 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73  e (...) contains
ce40: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65   a.** NULL value
ce50: 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73  , then *prRhsHas
ce60: 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63  Null is left unc
ce70: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
ce80: 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
ce90: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73  llocated and its
cea0: 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64   location stored
ceb0: 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c   in *prRhsHasNul
cec0: 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76  l, then.** the v
ced0: 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65 67  alue in that reg
cee0: 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55  ister will be NU
cef0: 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  LL if the b-tree
cf00: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
cf10: 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61   more.** NULL va
cf20: 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c  lues, and it wil
cf30: 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55  l be some non-NU
cf40: 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65 20  LL value if the 
cf50: 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20  b-tree contains 
cf60: 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  no.** NULL value
cf70: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  s..*/.#ifndef SQ
cf80: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
cf90: 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  RY.int sqlite3Fi
cfa0: 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20  ndInIndex(Parse 
cfb0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
cfc0: 58 2c 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20  X, u32 inFlags, 
cfd0: 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  int *prRhsHasNul
cfe0: 6c 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  l){.  Select *p;
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d010: 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67  ELECT to the rig
d020: 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  ht of IN operato
d030: 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  r */.  int eType
d040: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d060: 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c  Type of RHS tabl
d070: 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f  e. IN_INDEX_* */
d080: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
d090: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
d0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
d0b0: 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61  or of the RHS ta
d0c0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
d0d0: 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20  tBeUnique;      
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d0f0: 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75  * True if RHS mu
d100: 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a  st be unique */.
d110: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
d120: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
d130: 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75  e);     /* Virtu
d140: 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
d150: 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73   coded */..  ass
d160: 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
d170: 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e  IN );.  mustBeUn
d180: 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20  ique = (inFlags 
d190: 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29  & IN_INDEX_LOOP)
d1a0: 21 3d 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  !=0;..  /* Check
d1b0: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78   to see if an ex
d1c0: 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20  isting table or 
d1d0: 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
d1e0: 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66  d to.  ** satisf
d1f0: 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68  y the query.  Th
d200: 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65  is is preferable
d210: 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61   to generating a
d220: 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d   new .  ** ephem
d230: 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  eral table..  */
d240: 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61 73 50  .  p = (ExprHasP
d250: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
d260: 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e  IsSelect) ? pX->
d270: 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a  x.pSelect : 0);.
d280: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61    if( ALWAYS(pPa
d290: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26  rse->nErr==0) &&
d2a0: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
d2b0: 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73  nOpt(p) ){.    s
d2c0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d2d0: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
d2e0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
d2f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
d300: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
d330: 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  ble <table>. */.
d340: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
d370: 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e  pression <column
d380: 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 43 6f  > */.    i16 iCo
d390: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
d3c0: 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20  mn <column> */. 
d3d0: 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20     i16 iDb;     
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
d400: 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54  abase idx for pT
d410: 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ab */..    asser
d420: 74 28 20 70 20 29 3b 20 20 20 20 20 20 20 20 20  t( p );         
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d440: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
d450: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
d460: 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
d470: 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
d480: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
d490: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
d4a0: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
d4b0: 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
d4c0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  t( p->pEList->a[
d4d0: 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f  0].pExpr!=0 ); /
d4e0: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
d4f0: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
d500: 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
d510: 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b  t( p->pSrc!=0 );
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d530: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
d540: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
d550: 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20  (p) */.    pTab 
d560: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
d570: 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20  pTab;.    pExpr 
d580: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
d590: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f  ].pExpr;.    iCo
d5a0: 6c 20 3d 20 28 69 31 36 29 70 45 78 70 72 2d 3e  l = (i16)pExpr->
d5b0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20  iColumn;.   .   
d5c0: 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54   /* Code an OP_T
d5d0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f  ransaction and O
d5e0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
d5f0: 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
d600: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
d610: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
d620: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
d630: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
d640: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
d650: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
d660: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
d670: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
d680: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
d690: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
d6a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
d6b0: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
d6c0: 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e  m two places. In
d6d0: 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20   both cases the 
d6e0: 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  vdbe.    ** has 
d6f0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
d700: 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d  ocated. So assum
d710: 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  e sqlite3GetVdbe
d720: 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20  () is always.   
d730: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68   ** successful h
d740: 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
d750: 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69  assert(v);.    i
d760: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
d770: 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
d780: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
d790: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 56 64  Parse);.      Vd
d7a0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
d7b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
d7c0: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
d7d0: 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
d7e0: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
d7f0: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
d800: 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20  NDEX_ROWID;..   
d810: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d820: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
d830: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d840: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
d870: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
d880: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
d890: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
d8a0: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d   used by the com
d8b0: 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69  parison. If an i
d8c0: 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20  ndex is to.     
d8d0: 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70   ** be used in p
d8e0: 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74  lace of a temp-t
d8f0: 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65  able, it must be
d900: 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69   ordered accordi
d910: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  ng.      ** to t
d920: 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  his collation se
d930: 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20  quence.  */.    
d940: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20    CollSeq *pReq 
d950: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
d960: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
d970: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
d980: 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20   pExpr);..      
d990: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
d9a0: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
d9b0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
d9c0: 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20  perform the .   
d9d0: 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
d9e0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
d9f0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
da00: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20  the column. If. 
da10: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f       ** it is no
da20: 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  t, it is not pos
da30: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79  sible to use any
da40: 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f   index..      */
da50: 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e  .      int affin
da60: 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33  ity_ok = sqlite3
da70: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
da80: 70 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  pX, pTab->aCol[i
da90: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a  Col].affinity);.
daa0: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
dab0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
dac0: 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26  dx && eType==0 &
dad0: 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70  & affinity_ok; p
dae0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
daf0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
db00: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
db10: 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20  ==iCol).        
db20: 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43   && sqlite3FindC
db30: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
db40: 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  b), pIdx->azColl
db50: 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20  [0], 0)==pReq.  
db60: 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74         && (!must
db70: 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64  BeUnique || (pId
db80: 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26  x->nKeyCol==1 &&
db90: 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
dba0: 49 64 78 29 29 29 0a 20 20 20 20 20 20 20 20 29  Idx))).        )
dbb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
dbc0: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  iAddr = sqlite3C
dbd0: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
dbe0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
dbf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
dc00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
dc10: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
dc20: 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ab, pIdx->tnum, 
dc30: 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iDb);.          
dc40: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
dc50: 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
dc60: 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pIdx);.         
dc70: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
dc80: 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
dc90: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
dca0: 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58  assert( IN_INDEX
dcb0: 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49  _INDEX_DESC == I
dcc0: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
dcd0: 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  C+1 );.         
dce0: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
dcf0: 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49  X_INDEX_ASC + pI
dd00: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  dx->aSortOrder[0
dd10: 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  ];..          if
dd20: 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26  ( prRhsHasNull &
dd30: 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  & !pTab->aCol[iC
dd40: 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20  ol].notNull ){. 
dd50: 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
dd60: 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
dd70: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
dd80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
dd90: 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20  tHasNullFlag(v, 
dda0: 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e  iTab, *prRhsHasN
ddb0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
ddc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
ddd0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
dde0: 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  v, iAddr);.     
ddf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
de00: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
de10: 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69  no preexisting i
de20: 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c  ndex is availabl
de30: 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61  e for the IN cla
de40: 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f  use.  ** and IN_
de50: 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e  INDEX_NOOP is an
de60: 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20   allowed reply. 
de70: 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
de80: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
de90: 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f  or is a list, no
dea0: 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a  t a subquery.  *
deb0: 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73  * and the RHS is
dec0: 20 6e 6f 74 20 63 6f 6e 74 61 6e 74 20 6f 72 20   not contant or 
ded0: 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72  has two or fewer
dee0: 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65   terms,.  ** the
def0: 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74  n it is not wort
df00: 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  h creating an ep
df10: 68 65 72 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  hermeral table t
df20: 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20  o evaluate.  ** 
df30: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
df40: 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  so return IN_IND
df50: 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20  EX_NOOP..  */.  
df60: 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20  if( eType==0.   
df70: 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e  && (inFlags & IN
df80: 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a  _INDEX_NOOP_OK).
df90: 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
dfa0: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
dfb0: 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28  sSelect).   && (
dfc0: 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43  !sqlite3InRhsIsC
dfd0: 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70  onstant(pX) || p
dfe0: 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  X->x.pList->nExp
dff0: 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65  r<=2).  ){.    e
e000: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
e010: 4e 4f 4f 50 3b 0a 20 20 7d 0a 20 20 20 20 20 0a  NOOP;.  }.     .
e020: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
e030: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20  ){.    /* Could 
e040: 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73  not find an exis
e050: 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
e060: 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68  dex to use as th
e070: 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20  e RHS b-tree..  
e080: 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76    ** We will hav
e090: 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
e0a0: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
e0b0: 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a   to do the job..
e0c0: 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73      */.    u32 s
e0d0: 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
e0e0: 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
e0f0: 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61  oop;.    int rMa
e100: 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20  yHaveNull = 0;. 
e110: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
e120: 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28  DEX_EPH;.    if(
e130: 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e   inFlags & IN_IN
e140: 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20  DEX_LOOP ){.    
e150: 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
e160: 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Loop = 0;.      
e170: 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69  if( pX->pLeft->i
e180: 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70  Column<0 && !Exp
e190: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
e1a0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
e1b0: 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20  {.        eType 
e1c0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
e1d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
e1e0: 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61 73  lse if( prRhsHas
e1f0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70  Null ){.      *p
e200: 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d  rRhsHasNull = rM
e210: 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70  ayHaveNull = ++p
e220: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
e230: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
e240: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
e250: 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65  se, pX, rMayHave
e260: 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f  Null, eType==IN_
e270: 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20  INDEX_ROWID);.  
e280: 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
e290: 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65  Loop = savedNQue
e2a0: 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b  ryLoop;.  }else{
e2b0: 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20  .    pX->iTable 
e2c0: 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65  = iTab;.  }.  re
e2d0: 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65  turn eType;.}.#e
e2e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
e2f0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63  rate code for sc
e300: 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
e310: 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65  used as a subque
e320: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45  ry expression, E
e330: 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20  XISTS,.** or IN 
e340: 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d  operators.  Exam
e350: 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
e360: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
e370: 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75  )          -- su
e380: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58  bquery.**     EX
e390: 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46  ISTS (SELECT a F
e3a0: 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53  ROM b)   -- EXIS
e3b0: 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  TS subquery.**  
e3c0: 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29     x IN (4,5,11)
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
e3e0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
e3f0: 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d  h list on right-
e400: 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20  hand side.**    
e410: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20   x IN (SELECT a 
e420: 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49  FROM b)     -- I
e430: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
e440: 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20  subquery on the 
e450: 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  right.**.** The 
e460: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
e470: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78  describes the ex
e480: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
e490: 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a  ntains the IN.**
e4a0: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62   operator or sub
e4b0: 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
e4c0: 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69  parameter isRowi
e4d0: 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  d is non-zero, t
e4e0: 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70  hen expression p
e4f0: 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65  Expr is guarante
e500: 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74  ed.** to be of t
e510: 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e  he form "<rowid>
e520: 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20   IN (?, ?, ?)", 
e530: 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73  where <rowid> is
e540: 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20   a reference.** 
e550: 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20  to some integer 
e560: 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  key column of a 
e570: 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e  table B-Tree. In
e580: 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20   this case, use 
e590: 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54  an.** intkey B-T
e5a0: 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ree to store the
e5b0: 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20   set of IN(...) 
e5c0: 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f  values instead o
e5d0: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28  f the usual.** (
e5e0: 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65  slower) variable
e5f0: 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54   length keys B-T
e600: 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d  ree..**.** If rM
e610: 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f  ayHaveNull is no
e620: 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  n-zero, that mea
e630: 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72  ns that the oper
e640: 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a  ation is an IN.*
e650: 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  * (not a SELECT 
e660: 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74  or EXISTS) and t
e670: 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68  hat the RHS migh
e680: 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  t contains NULLs
e690: 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f  ..** All this ro
e6a0: 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e  utine does is in
e6b0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67  itialize the reg
e6c0: 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72  ister given by r
e6d0: 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74  MayHaveNull.** t
e6e0: 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67  o NULL.  Calling
e6f0: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74   routines will t
e700: 61 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e  ake care of chan
e710: 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74  ging this regist
e720: 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e  er.** value to n
e730: 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52  on-NULL if the R
e740: 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e  HS is NULL-free.
e750: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c  .**.** For a SEL
e760: 45 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70  ECT or EXISTS op
e770: 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74  erator, return t
e780: 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74  he register that
e790: 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65   holds the.** re
e7a0: 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70  sult.  For IN op
e7b0: 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e  erators or if an
e7c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
e7d0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
e7e0: 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  is 0..*/.#ifndef
e7f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
e800: 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
e810: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a  3CodeSubselect(.
e820: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
e840: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
e850: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
e860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e870: 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20   IN, SELECT, or 
e880: 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20  EXISTS operator 
e890: 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c  */.  int rHasNul
e8a0: 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20  lFlag,       /* 
e8b0: 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65  Register that re
e8c0: 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55  cords whether NU
e8d0: 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53  LLs exist in RHS
e8e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69   */.  int isRowi
e8f0: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d             /*
e900: 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66   If true, LHS of
e910: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
e920: 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  a rowid */.){.  
e930: 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  int jmpIfDynamic
e940: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
e950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e960: 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
e970: 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52  ress */.  int rR
e980: 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74    /* Register st
e9b0: 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20  oring resulting 
e9c0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
e9d0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
e9e0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56  arse);.  if( NEV
e9f0: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
ea00: 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  n 0;.  sqlite3Ex
ea10: 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
ea20: 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  se);..  /* This 
ea30: 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e  code must be run
ea40: 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79   in its entirety
ea50: 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69   every time it i
ea60: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
ea70: 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ** if any of the
ea80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
ea90: 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
eaa0: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
eab0: 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
eac0: 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
ead0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
eae0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
eaf0: 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
eb00: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
eb10: 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
eb20: 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
eb30: 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
eb40: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
eb50: 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
eb60: 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
eb70: 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
eb80: 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
eb90: 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
eba0: 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
ebb0: 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
ebc0: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
ebd0: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
ebe0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
ebf0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
ec00: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a  Select) ){.    j
ec10: 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71  mpIfDynamic = sq
ec20: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
ec30: 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
ec40: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66  age(v);.  }..#if
ec50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ec60: 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70  _EXPLAIN.  if( p
ec70: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
ec80: 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
ec90: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
eca0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
ecb0: 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55  arse->db, "EXECU
ecc0: 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52 59  TE %s%s SUBQUERY
ecd0: 20 25 64 22 2c 20 6a 6d 70 49 66 44 79 6e 61 6d   %d", jmpIfDynam
ece0: 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c  ic>=0?"":"CORREL
ecf0: 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20  ATED ",.        
ed00: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
ed10: 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22  ?"LIST":"SCALAR"
ed20: 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
ed30: 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20  electId.    );. 
ed40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ed50: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
ed60: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
ed70: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
ed80: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
ed90: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77    }.#endif..  sw
eda0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
edb0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
edc0: 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  N: {.      char 
edd0: 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  affinity;       
ede0: 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
edf0: 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66  ty of the LHS of
ee00: 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20   the IN */.     
ee10: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee30: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
ee40: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
ee50: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruction */.     
ee60: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
ee70: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20  Expr->pLeft; /* 
ee80: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
ee90: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
eea0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
eeb0: 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
eec0: 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
eed0: 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66  on */..      aff
eee0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
eef0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
ef00: 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  t);..      /* Wh
ef10: 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e  ether this is an
ef20: 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e   'x IN(SELECT...
ef30: 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c  )' or an 'x IN(<
ef40: 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20  exprlist>)'.    
ef50: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
ef60: 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68  it is handled th
ef70: 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20  e same way.  An 
ef80: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
ef90: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
efa0: 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d  led with single-
efb0: 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73  field index keys
efc0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
efd0: 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
efe0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45  ** from the SELE
eff0: 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c  CT or the <exprl
f000: 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ist>..      **. 
f010: 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27       ** If the '
f020: 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  x' expression is
f030: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
f040: 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e   or the SELECT..
f050: 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ..      ** state
f060: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
f070: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
f080: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
f090: 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
f0a0: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
f0b0: 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
f0c0: 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
f0d0: 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20  'x' and the.    
f0e0: 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73    ** SELECT... s
f0f0: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
f100: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
f110: 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
f120: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  sed.      ** if 
f130: 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
f140: 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
f150: 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
f160: 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20  f neither.      
f170: 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53  ** 'x' nor the S
f180: 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
f190: 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
f1a0: 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
f1b0: 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69  inity.      ** i
f1c0: 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  s used..      */
f1d0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
f1e0: 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
f1f0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64  Tab++;.      add
f200: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
f210: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
f220: 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72  Ephemeral, pExpr
f230: 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52 6f 77  ->iTable, !isRow
f240: 69 64 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  id);.      pKeyI
f250: 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20  nfo = isRowid ? 
f260: 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 : sqlite3KeyIn
f270: 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
f280: 64 62 2c 20 31 2c 20 31 29 3b 0a 0a 20 20 20 20  db, 1, 1);..    
f290: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
f2a0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f2b0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
f2c0: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a        /* Case 1:
f2d0: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
f2e0: 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20  LECT ...).      
f2f0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
f300: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
f310: 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
f320: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
f330: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72   into the tempor
f340: 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ary.        ** t
f350: 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  able allocated a
f360: 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  nd opened above.
f370: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
f380: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
f390: 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ect = pExpr->x.p
f3a0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
f3b0: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
f3c0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
f3d0: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t *pEList;..    
f3e0: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
f3f0: 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
f400: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
f410: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
f420: 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
f430: 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65  ble);.        de
f440: 73 74 2e 61 66 66 53 64 73 74 20 3d 20 28 75 38  st.affSdst = (u8
f450: 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  )affinity;.     
f460: 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
f470: 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
f480: 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
f490: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
f4a0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
f4b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 74 65 73  = 0;.        tes
f4c0: 74 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e  tcase( pSelect->
f4d0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
f4e0: 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
f4f0: 20 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c    pSelect->selFl
f500: 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
f510: 6e 63 74 3b 0a 20 20 20 20 20 20 20 20 74 65 73  nct;.        tes
f520: 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d  tcase( pKeyInfo=
f530: 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20  =0 ); /* Caused 
f540: 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65  by OOM in sqlite
f550: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20  3KeyInfoAlloc() 
f560: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
f570: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
f580: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
f590: 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
f5a0: 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
f5b0: 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b  Unref(pKeyInfo);
f5c0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
f5d0: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
f5e0: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
f5f0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
f600: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f610: 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20   pKeyInfo!=0 ); 
f620: 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73  /* OOM will caus
f630: 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c  e exit after sql
f640: 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a  ite3Select() */.
f650: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f660: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
f670: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
f680: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
f690: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f6a0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
f6b0: 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
f6c0: 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  fo) );.        p
f6d0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
f6e0: 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  ] = sqlite3Binar
f6f0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
f700: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
f710: 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Left,.          
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f750: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
f760: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
f770: 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
f780: 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b  ->x.pList!=0) ){
f790: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
f7a0: 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   2:     expr IN 
f7b0: 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20  (exprlist).     
f7c0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
f7d0: 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
f7e0: 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
f7f0: 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
f800: 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
f810: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
f820: 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
f830: 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
f840: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
f850: 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
f860: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c       ** that col
f870: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68  umns affinity wh
f880: 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65  en building inde
f890: 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72  x keys. If <expr
f8a0: 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  > is not.       
f8b0: 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
f8c0: 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
f8d0: 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ty..        */. 
f8e0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
f8f0: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
f900: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
f910: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  .pList;.        
f920: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
f930: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
f940: 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c       int r1, r2,
f950: 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66   r3;..        if
f960: 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  ( !affinity ){. 
f970: 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
f980: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
f990: 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
f9a0: 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
f9b0: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
f9c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f9d0: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
f9e0: 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a  le(pKeyInfo) );.
f9f0: 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
fa00: 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  fo->aColl[0] = s
fa10: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
fa20: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
fa30: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
fa40: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c   }..        /* L
fa50: 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
fa60: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c   expression in <
fa70: 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20  exprlist>. */.  
fa80: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
fa90: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
faa0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32  rse);.        r2
fab0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
fac0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
fad0: 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
fae0: 64 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  d ) sqlite3VdbeA
faf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
fb00: 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  , 0, r2);.      
fb10: 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
fb20: 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
fb30: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
fb40: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
fb50: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
fb60: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
fb70: 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
fb80: 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
fb90: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
fba0: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
fbb0: 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
fbc0: 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
fbd0: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
fbe0: 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
fbf0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
fc00: 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
fc10: 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
fc20: 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
fc30: 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
fc40: 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
fc50: 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
fc60: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
fc70: 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
fc80: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
fc90: 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
fca0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
fcb0: 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
fcc0: 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
fcd0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
fce0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
fcf0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
fd00: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49  geToNoop(v, jmpI
fd10: 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20  fDynamic);.     
fd20: 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
fd30: 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mic = -1;.      
fd40: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
fd50: 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
fd60: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
fd70: 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
fd80: 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
fd90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
fda0: 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65  sRowid && sqlite
fdb0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
fdc0: 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20  E2, &iValToIns) 
fdd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
fde0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fdf0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74  (v, OP_InsertInt
fe00: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
fe10: 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b   r2, iValToIns);
fe20: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
fe30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33  {.            r3
fe40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
fe50: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
fe60: 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
fe70: 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
fe80: 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
fe90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fea0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
feb0: 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20  BeInt, r3,.     
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fed0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
fee0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
fef0: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
ff00: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
ff10: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
ff20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ff30: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
ff40: 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
ff50: 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20  ble, r2, r3);.  
ff60: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
ff70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
ff80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
ff90: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
ffa0: 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
ffb0: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
ffc0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ffd0: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
ffe0: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
fff0: 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r3, 1);.      
10000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10010 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10020 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72  IdxInsert, pExpr
10030 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20  ->iTable, r2);. 
10040 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
10050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10060 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
10070 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
10080 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
10090 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
100a0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
100b0 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
100c0 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
100d0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nfo ){.        s
100e0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
100f0 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P4(v, addr, (voi
10100 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  d *)pKeyInfo, P4
10110 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
10120 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10130 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
10140 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
10150 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
10160 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
10170 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68      /* If this h
10180 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  as to be a scala
10190 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72  r SELECT.  Gener
101a0 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
101b0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c  the.      ** val
101c0 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63  ue of this selec
101d0 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65  t in a memory ce
101e0 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ll and record th
101f0 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
10200 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  * of the memory 
10210 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e  cell in iColumn.
10220 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20    If this is an 
10230 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20  EXISTS, write.  
10240 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
10250 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29  r 0 (not exists)
10260 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 20 69   or 1 (exists) i
10270 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  nto a memory cel
10280 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  l.      ** and r
10290 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72  ecord that memor
102a0 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
102b0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
102c0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
102f0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  T statement to e
10300 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53  ncode */.      S
10310 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
10320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10330 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
10340 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74 20  eal with SELECt 
10350 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20  result */..     
10360 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
10370 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
10380 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10390 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
103a0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
103b0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
103c0 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c  op==TK_EXISTS ||
103d0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
103e0 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20 20  ELECT );..      
103f0 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
10400 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
10410 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
10420 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78        pSel = pEx
10430 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
10440 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
10450 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
10460 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  , 0, ++pParse->n
10470 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Mem);.      if( 
10480 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
10490 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
104a0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
104b0 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71  _Mem;.        sq
104c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
104d0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64  v, OP_Null, 0, d
104e0 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20  est.iSDParm);.  
104f0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
10500 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71  t((v, "Init subq
10510 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
10520 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10530 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
10540 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20  = SRT_Exists;.  
10550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10560 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
10570 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69  teger, 0, dest.i
10580 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  SDParm);.       
10590 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
105a0 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65   "Init EXISTS re
105b0 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
105c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
105d0 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
105e0 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69  >db, pSel->pLimi
105f0 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  t);.      pSel->
10600 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
10610 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
10620 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a  _INTEGER, 0, 0,.
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b    &sqlite3IntTok
10660 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70  ens[1]);.      p
10670 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  Sel->iLimit = 0;
10680 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
10690 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
106a0 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b   pSel, &dest) ){
106b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
106c0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
106d0 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44   rReg = dest.iSD
106e0 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72  Parm;.      Expr
106f0 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
10700 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
10710 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
10720 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
10730 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29  ( rHasNullFlag )
10740 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
10750 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70  HasNullFlag(v, p
10760 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48  Expr->iTable, rH
10770 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d  asNullFlag);.  }
10780 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e  ..  if( jmpIfDyn
10790 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73  amic>=0 ){.    s
107a0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
107b0 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d  re(v, jmpIfDynam
107c0 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ic);.  }.  sqlit
107d0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
107e0 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72  Parse);..  retur
107f0 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66  n rReg;.}.#endif
10800 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10810 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
10820 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10830 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
10840 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
10850 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69  r an IN expressi
10860 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  on..**.**      x
10870 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
10880 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76  .**      x IN (v
10890 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
108a0 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ).**.** The left
108b0 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29  -hand side (LHS)
108c0 20 69 73 20 61 20 73 63 61 6c 61 72 20 65 78 70   is a scalar exp
108d0 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72 69  ression.  The ri
108e0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52  ght-hand side (R
108f0 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72  HS).** is an arr
10900 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ay of zero or mo
10910 72 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20  re values.  The 
10920 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
10930 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ue if the LHS is
10940 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
10950 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54  thin the RHS.  T
10960 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
10970 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
10980 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20  known (NULL).** 
10990 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55  if the LHS is NU
109a0 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48 53  LL or if the LHS
109b0 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
109c0 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
109d0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53 20   and the.** RHS 
109e0 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
109f0 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
10a00 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10a10 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
10a20 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74  ode that jumps t
10a30 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66  o destIfFalse if
10a40 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
10a50 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
10a60 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49  thin the RHS.  I
10a70 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77  f due to NULLs w
10a80 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
10a90 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a  ne if the LHS.**
10aa0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
10ab0 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75   the RHS then ju
10ac0 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c  mp to destIfNull
10ad0 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  .  If the LHS is
10ae0 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69   contained.** wi
10af0 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  thin the RHS the
10b00 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a  n fall through..
10b10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
10b20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
10b30 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10b40 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
10b50 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
10b60 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
10b70 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
10b80 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
10b90 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  he IN expression
10ba0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
10bb0 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a  False,      /* J
10bc0 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20  ump here if LHS 
10bd0 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
10be0 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   in the RHS */. 
10bf0 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
10c00 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
10c10 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  ere if the resul
10c20 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64  ts are unknown d
10c30 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29  ue to NULLs */.)
10c40 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e  {.  int rRhsHasN
10c50 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67  ull = 0;  /* Reg
10c60 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72  ister that is tr
10c70 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69  ue if RHS contai
10c80 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a  ns NULL values *
10c90 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69 74  /.  char affinit
10ca0 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  y;        /* Com
10cb0 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79  parison affinity
10cc0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   to use */.  int
10cd0 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20   eType;         
10ce0 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
10cf0 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72  e RHS */.  int r
10d00 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
10d10 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
10d20 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  e register */.  
10d30 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
10d40 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65        /* Stateme
10d50 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
10d60 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
10d70 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20  ompute the RHS. 
10d80 20 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65    After this ste
10d90 70 2c 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  p, the table wit
10da0 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45  h cursor.  ** pE
10db0 78 70 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c  xpr->iTable will
10dc0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
10dd0 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
10de0 70 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a  p the RHS..  */.
10df0 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
10e00 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
10e10 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
10e20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69  OOM detected pri
10e30 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
10e40 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  ne */.  VdbeNoop
10e50 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
10e60 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20  in IN expr"));. 
10e70 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
10e80 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
10e90 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20  se, pExpr,.     
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10eb0 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58          IN_INDEX
10ec0 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e  _MEMBERSHIP | IN
10ed0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a  _INDEX_NOOP_OK,.
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73               des
10f00 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
10f10 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73  Null ? 0 : &rRhs
10f20 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20  HasNull);..  /* 
10f30 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 61  Figure out the a
10f40 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74  ffinity to use t
10f50 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20 66  o create a key f
10f60 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rom the results.
10f70 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72    ** of the expr
10f80 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79  ession. affinity
10f90 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61  Str stores a sta
10fa0 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61  tic string suita
10fb0 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20  ble for.  ** P4 
10fc0 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  of OP_MakeRecord
10fd0 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74  ..  */.  affinit
10fe0 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  y = comparisonAf
10ff0 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a  finity(pExpr);..
11000 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48    /* Code the LH
11010 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72  S, the <expr> fr
11020 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e  om "<expr> IN (.
11030 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ..)"..  */.  sql
11040 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
11050 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72 31 20  h(pParse);.  r1 
11060 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
11070 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
11080 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
11090 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
110a0 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20  eft, r1);..  /* 
110b0 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  If sqlite3FindIn
110c0 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20  Index() did not 
110d0 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
110e0 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  n index that is.
110f0 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f    ** suitable fo
11100 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65  r evaluating the
11110 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68   IN operator, th
11120 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e  en evaluate usin
11130 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  g a.  ** sequenc
11140 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73  e of comparisons
11150 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
11160 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  pe==IN_INDEX_NOO
11170 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  P ){.    ExprLis
11180 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
11190 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43  ->x.pList;.    C
111a0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
111b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
111c0 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
111d0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e  ->pLeft);.    in
111e0 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69  t labelOk = sqli
111f0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11200 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c  (v);.    int r2,
11210 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20   regToFree;.    
11220 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20  int regCkNull = 
11230 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  0;.    int ii;. 
11240 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
11250 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
11260 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
11270 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74   );.    if( dest
11280 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61  IfNull!=destIfFa
11290 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67  lse ){.      reg
112a0 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  CkNull = sqlite3
112b0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
112c0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
112d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
112e0 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c 20 72 31  P_BitAnd, r1, r1
112f0 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
11300 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
11310 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ; ii<pList->nExp
11320 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
11330 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
11340 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
11350 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45   pList->a[ii].pE
11360 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65 29  xpr, &regToFree)
11370 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 43  ;.      if( regC
11380 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65 33  kNull && sqlite3
11390 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c  ExprCanBeNull(pL
113a0 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  ist->a[ii].pExpr
113b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
113c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
113d0 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65 67  , OP_BitAnd, reg
113e0 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43  CkNull, r2, regC
113f0 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  kNull);.      }.
11400 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c 69        if( ii<pLi
11410 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64  st->nExpr-1 || d
11420 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
11430 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
11440 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11450 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 31  Op4(v, OP_Eq, r1
11460 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20  , labelOk, r2,. 
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
11490 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
114a0 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  Q);.        Vdbe
114b0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69  CoverageIf(v, ii
114c0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  <pList->nExpr-1)
114d0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
114e0 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d  verageIf(v, ii==
114f0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b  pList->nExpr-1);
11500 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11510 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
11520 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20  affinity);.     
11530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11540 61 73 73 65 72 74 28 20 64 65 73 74 49 66 4e 75  assert( destIfNu
11550 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll==destIfFalse 
11560 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11570 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
11580 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65 73 74 49  OP_Ne, r1, destI
11590 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20  fFalse, r2,.    
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
115c0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
115d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
115e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
115f0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
11600 20 61 66 66 69 6e 69 74 79 20 7c 20 53 51 4c 49   affinity | SQLI
11610 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
11620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
11630 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11640 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54  Reg(pParse, regT
11650 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  oFree);.    }.  
11660 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
11670 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11680 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11690 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75  _IsNull, regCkNu
116a0 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  ll, destIfNull);
116b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
116c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
116d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
116e0 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46  Goto, 0, destIfF
116f0 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alse);.    }.   
11700 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
11710 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
11720 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lOk);.    sqlite
11730 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
11740 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c  pParse, regCkNul
11750 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a  l);.  }else{.  .
11760 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48      /* If the LH
11770 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  S is NULL, then 
11780 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 65 69  the result is ei
11790 74 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55  ther false or NU
117a0 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20  LL depending.   
117b0 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 74   ** on whether t
117c0 68 65 20 52 48 53 20 69 73 20 65 6d 70 74 79 20  he RHS is empty 
117d0 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69  or not, respecti
117e0 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  vely..    */.   
117f0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
11800 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 2d  CanBeNull(pExpr-
11810 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20  >pLeft) ){.     
11820 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d   if( destIfNull=
11830 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
11840 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74          /* Short
11850 63 75 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  cut for the comm
11860 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
11870 65 20 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c 4c  e false and NULL
11880 20 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a 20 20   outcomes are.  
11890 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d        ** the sam
118a0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  e. */.        sq
118b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
118c0 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31  v, OP_IsNull, r1
118d0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56  , destIfNull); V
118e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
118f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11900 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d       int addr1 =
11910 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11920 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
11930 2c 20 72 31 29 3b 20 56 64 62 65 43 6f 76 65 72  , r1); VdbeCover
11940 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
11950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11960 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
11970 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
11980 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
11990 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
119a0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
119b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
119c0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
119d0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
119e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
119f0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
11a00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11a10 0a 20 20 0a 20 20 20 20 69 66 28 20 65 54 79 70  .  .    if( eTyp
11a20 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
11a30 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  D ){.      /* In
11a40 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
11a50 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44  RHS is the ROWID
11a60 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65   of table b-tree
11a70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11a80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11a90 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
11aa0 74 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c  t, r1, destIfFal
11ab0 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
11ac0 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
11ad0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11ae0 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70   OP_NotExists, p
11af0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
11b00 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b 0a  stIfFalse, r1);.
11b10 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
11b20 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ge(v);.    }else
11b30 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
11b40 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53  is case, the RHS
11b50 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   is an index b-t
11b60 72 65 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ree..      */.  
11b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11b80 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
11b90 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c 20  nity, r1, 1, 0, 
11ba0 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  &affinity, 1);. 
11bb0 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
11bc0 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  e set membership
11bd0 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65   test fails, the
11be0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
11bf0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 22 78  the .      ** "x
11c00 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65   IN (...)" expre
11c10 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69  ssion must be ei
11c20 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20  ther 0 or NULL. 
11c30 49 66 20 74 68 65 20 73 65 74 0a 20 20 20 20 20  If the set.     
11c40 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   ** contains no 
11c50 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
11c60 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
11c70 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a 20  0. If the set . 
11c80 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
11c90 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
11ca0 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74  L values, then t
11cb0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
11cc0 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
11cd0 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c  sion is also NUL
11ce0 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  L..      */.    
11cf0 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66    assert( destIf
11d00 46 61 6c 73 65 21 3d 64 65 73 74 49 66 4e 75 6c  False!=destIfNul
11d10 6c 20 7c 7c 20 72 52 68 73 48 61 73 4e 75 6c 6c  l || rRhsHasNull
11d20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
11d30 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20   rRhsHasNull==0 
11d40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
11d50 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
11d60 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74  f it is known at
11d70 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68   compile time th
11d80 61 74 20 74 68 65 20 52 48 53 0a 20 20 20 20 20  at the RHS.     
11d90 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e     ** cannot con
11da0 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73  tain NULL values
11db0 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 61  . This happens a
11dc0 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  s the result.   
11dd0 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f       ** of a "NO
11de0 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
11df0 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
11e00 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 20  se schema..     
11e10 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
11e20 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20 62   Also run this b
11e30 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69 73  ranch if NULL is
11e40 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 46   equivalent to F
11e50 41 4c 53 45 0a 20 20 20 20 20 20 20 20 2a 2a 20  ALSE.        ** 
11e60 66 6f 72 20 74 68 69 73 20 70 61 72 74 69 63 75  for this particu
11e70 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  lar IN operator.
11e80 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
11e90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11ea0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
11eb0 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  otFound, pExpr->
11ec0 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
11ed0 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  lse, r1, 1);.   
11ee0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
11ef0 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
11f00 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  e{.        /* In
11f10 20 74 68 69 73 20 62 72 61 6e 63 68 2c 20 74 68   this branch, th
11f20 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
11f30 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20  might contain a 
11f40 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20 20  NULL and.       
11f50 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e 63 65   ** the presence
11f60 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68   of a NULL on th
11f70 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20 64 69  e RHS makes a di
11f80 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 0a  fference in the.
11f90 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f          ** outco
11fa0 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  me..        */. 
11fb0 20 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20         int j1;. 
11fc0 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72   .        /* Fir
11fd0 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
11fe0 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f  if the LHS is co
11ff0 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
12000 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20 20  HS.  If so,.    
12010 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
12020 61 6e 73 77 65 72 20 69 73 20 54 52 55 45 20 74  answer is TRUE t
12030 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 4e  he presence of N
12040 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20  ULLs in the RHS 
12050 64 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  does.        ** 
12060 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 49 66 20  not matter.  If 
12070 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63  the LHS is not c
12080 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
12090 52 48 53 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  RHS, then the.  
120a0 20 20 20 20 20 20 2a 2a 20 61 6e 73 77 65 72 20        ** answer 
120b0 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 52  is NULL if the R
120c0 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  HS contains NULL
120d0 73 20 61 6e 64 20 74 68 65 20 61 6e 73 77 65 72  s and the answer
120e0 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 46   is.        ** F
120f0 41 4c 53 45 20 69 66 20 74 68 65 20 52 48 53 20  ALSE if the RHS 
12100 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20 20  is NULL-free..  
12110 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
12120 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
12130 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
12140 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
12150 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29  Table, 0, r1, 1)
12160 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
12170 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
12180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12190 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
121a0 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  l, rRhsHasNull, 
121b0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
121c0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
121d0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
121e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
121f0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
12200 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
12210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12220 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
12230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12240 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
12250 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
12260 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  e, r1);.  sqlite
12270 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
12280 61 72 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 6d  arse);.  VdbeCom
12290 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e  ment((v, "end IN
122a0 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64   expr"));.}.#end
122b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
122c0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
122d0 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61  *.** Duplicate a
122e0 6e 20 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a  n 8-byte value.*
122f0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
12300 75 70 38 62 79 74 65 73 28 56 64 62 65 20 2a 76  up8bytes(Vdbe *v
12310 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e  , const char *in
12320 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d  ){.  char *out =
12330 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
12340 52 61 77 28 73 71 6c 69 74 65 33 56 64 62 65 44  Raw(sqlite3VdbeD
12350 62 28 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20  b(v), 8);.  if( 
12360 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  out ){.    memcp
12370 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20  y(out, in, 8);. 
12380 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b   }.  return out;
12390 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
123a0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
123b0 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e  _POINT./*.** Gen
123c0 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
123d0 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
123e0 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20  ut the floating 
123f0 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64  point.** value d
12400 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e  escribed by z[0.
12410 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
12420 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
12430 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77  The z[] string w
12440 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74  ill probably not
12450 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61   be zero-termina
12460 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a  ted.  But the .*
12470 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72  * z[n] character
12480 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
12490 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74  o be something t
124a0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f  hat does not loo
124b0 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f  k.** like the co
124c0 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68  ntinuation of th
124d0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
124e0 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61  tic void codeRea
124f0 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  l(Vdbe *v, const
12500 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65   char *z, int ne
12510 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d  gateFlag, int iM
12520 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  em){.  if( ALWAY
12530 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64  S(z!=0) ){.    d
12540 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20  ouble value;.   
12550 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73   char *zV;.    s
12560 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76  qlite3AtoF(z, &v
12570 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72  alue, sqlite3Str
12580 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45  len30(z), SQLITE
12590 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65  _UTF8);.    asse
125a0 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61  rt( !sqlite3IsNa
125b0 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54  N(value) ); /* T
125c0 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65  he new AtoF neve
125d0 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f  r returns NaN */
125e0 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46  .    if( negateF
125f0 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76  lag ) value = -v
12600 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64  alue;.    zV = d
12610 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61  up8bytes(v, (cha
12620 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  r*)&value);.    
12630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12640 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  4(v, OP_Real, 0,
12650 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34   iMem, 0, zV, P4
12660 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _REAL);.  }.}.#e
12670 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ndif.../*.** Gen
12680 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
12690 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
126a0 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
126b0 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
126c0 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  xt z[0..n-1] int
126d0 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
126e0 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54  .**.** Expr.u.zT
126f0 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55  oken is always U
12700 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72  TF8 and zero-ter
12710 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  minated..*/.stat
12720 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
12730 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
12740 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
12750 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
12760 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a   iMem){.  Vdbe *
12770 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
12780 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  e;.  if( pExpr->
12790 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
127a0 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
127b0 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
127c0 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
127d0 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
127e0 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
127f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12800 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
12810 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
12820 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
12830 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c  t c;.    i64 val
12840 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ue;.    const ch
12850 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ar *z = pExpr->u
12860 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73  .zToken;.    ass
12870 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20  ert( z!=0 );.   
12880 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f   c = sqlite3DecO
12890 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61  rHexToI64(z, &va
128a0 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  lue);.    if( c=
128b0 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e  =0 || (c==2 && n
128c0 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20  egFlag) ){.     
128d0 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20   char *zV;.     
128e0 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20   if( negFlag ){ 
128f0 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53  value = c==2 ? S
12900 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20  MALLEST_INT64 : 
12910 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20  -value; }.      
12920 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76  zV = dup8bytes(v
12930 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29  , (char*)&value)
12940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12950 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12960 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20  Int64, 0, iMem, 
12970 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29  0, zV, P4_INT64)
12980 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
12990 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
129a0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
129b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
129c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76  rMsg(pParse, "ov
129d0 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a  ersized integer:
129e0 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20   %s%s", negFlag 
129f0 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a  ? "-" : "", z);.
12a00 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51  #else.#ifndef SQ
12a10 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e  LITE_OMIT_HEX_IN
12a20 54 45 47 45 52 0a 20 20 20 20 20 20 69 66 28 20  TEGER.      if( 
12a30 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
12a40 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b  (z,"0x",2)==0 ){
12a50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12a60 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12a70 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f   "hex literal to
12a80 6f 20 62 69 67 3a 20 25 73 22 2c 20 7a 29 3b 0a  o big: %s", z);.
12a90 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
12aa0 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
12ab0 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a     codeReal(v, z
12ac0 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29  , negFlag, iMem)
12ad0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
12ae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12af0 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61 63 68  .** Clear a cach
12b00 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74  e entry..*/.stat
12b10 69 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74  ic void cacheEnt
12b20 72 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  ryClear(Parse *p
12b30 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 79 43  Parse, struct yC
12b40 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20 20 69  olCache *p){.  i
12b50 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b  f( p->tempReg ){
12b60 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
12b70 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
12b80 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
12b90 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70  pReg) ){.      p
12ba0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
12bb0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
12bc0 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  ++] = p->iReg;. 
12bd0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70     }.    p->temp
12be0 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  Reg = 0;.  }.}..
12bf0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e  ./*.** Record in
12c00 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
12c10 65 20 74 68 61 74 20 61 20 70 61 72 74 69 63 75  e that a particu
12c20 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  lar column from 
12c30 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20  a.** particular 
12c40 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20  table is stored 
12c50 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  in a particular 
12c60 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69  register..*/.voi
12c70 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
12c80 68 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70  heStore(Parse *p
12c90 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c  Parse, int iTab,
12ca0 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69   int iCol, int i
12cb0 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
12cc0 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69   int minLru;.  i
12cd0 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72  nt idxLru;.  str
12ce0 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
12cf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 52 65  ;..  assert( iRe
12d00 67 3e 30 20 29 3b 20 20 2f 2a 20 52 65 67 69 73  g>0 );  /* Regis
12d10 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  ter numbers are 
12d20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 20  always positive 
12d30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f  */.  assert( iCo
12d40 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32  l>=-1 && iCol<32
12d50 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74  768 );  /* Finit
12d60 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73  e column numbers
12d70 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51   */..  /* The SQ
12d80 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
12d90 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74   flag disables t
12da0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
12db0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20    This is used. 
12dc0 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20   ** for testing 
12dd0 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79  only - to verify
12de0 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77   that SQLite alw
12df0 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61 6d  ays gets the sam
12e00 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69  e answer.  ** wi
12e10 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74  th and without t
12e20 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
12e30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .  */.  if( Opti
12e40 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
12e50 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  (pParse->db, SQL
12e60 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29  ITE_ColumnCache)
12e70 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
12e80 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61   First replace a
12e90 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  ny existing entr
12ea0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  y..  **.  ** Act
12eb0 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74  ually, the way t
12ec0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
12ed0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65  is currently use
12ee0 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e  d, we are guaran
12ef0 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74  teed.  ** that t
12f00 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e  he object will n
12f10 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65 20  ever already be 
12f20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69 66  in cache.  Verif
12f30 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65  y this guarantee
12f40 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ..  */.#ifndef N
12f50 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c  DEBUG.  for(i=0,
12f60 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
12f70 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
12f80 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
12f90 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p++){.    assert
12fa0 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20  ( p->iReg==0 || 
12fb0 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  p->iTable!=iTab 
12fc0 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  || p->iColumn!=i
12fd0 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Col );.  }.#endi
12fe0 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20  f..  /* Find an 
12ff0 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72  empty slot and r
13000 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66  eplace it */.  f
13010 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
13020 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
13030 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
13040 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
13050 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20   if( p->iReg==0 
13060 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76  ){.      p->iLev
13070 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
13080 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20  cheLevel;.      
13090 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  p->iTable = iTab
130a0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75  ;.      p->iColu
130b0 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  mn = iCol;.     
130c0 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
130d0 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  .      p->tempRe
130e0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  g = 0;.      p->
130f0 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
13100 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20  acheCnt++;.     
13110 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
13120 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65   }..  /* Replace
13130 20 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74   the last recent
13140 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e  ly used */.  min
13150 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66  Lru = 0x7fffffff
13160 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b  ;.  idxLru = -1;
13170 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
13180 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
13190 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
131a0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
131b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c  .    if( p->lru<
131c0 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20  minLru ){.      
131d0 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20  idxLru = i;.    
131e0 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72    minLru = p->lr
131f0 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  u;.    }.  }.  i
13200 66 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75  f( ALWAYS(idxLru
13210 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20  >=0) ){.    p = 
13220 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
13230 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20  he[idxLru];.    
13240 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72  p->iLevel = pPar
13250 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
13260 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  .    p->iTable =
13270 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43   iTab;.    p->iC
13280 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
13290 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67    p->iReg = iReg
132a0 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67  ;.    p->tempReg
132b0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75   = 0;.    p->lru
132c0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
132d0 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  eCnt++;.    retu
132e0 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn;.  }.}../*.**
132f0 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72   Indicate that r
13300 65 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e  egisters between
13310 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67   iReg..iReg+nReg
13320 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65  -1 are being ove
13330 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72  rwritten..** Pur
13340 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  ge the range of 
13350 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74  registers from t
13360 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
13370 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13380 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
13390 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
133a0 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
133b0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
133c0 6e 74 20 69 4c 61 73 74 20 3d 20 69 52 65 67 20  nt iLast = iReg 
133d0 2b 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73 74  + nReg - 1;.  st
133e0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
133f0 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
13400 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
13410 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
13420 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
13430 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70  ){.    int r = p
13440 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
13450 72 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d 69 4c  r>=iReg && r<=iL
13460 61 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 63  ast ){.      cac
13470 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
13480 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
13490 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
134a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
134b0 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72  emember the curr
134c0 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  ent column cache
134d0 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e   context.  Any n
134e0 65 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64  ew entries added
134f0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65  .** added to the
13500 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66   column cache af
13510 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72  ter this call ar
13520 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74  e removed when t
13530 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
13540 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a  ing pop occurs..
13550 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
13560 78 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72  xprCachePush(Par
13570 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
13580 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
13590 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c  el++;.#ifdef SQL
135a0 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
135b0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
135c0 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
135d0 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
135e0 20 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f   printf("PUSH to
135f0 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e   %d\n", pParse->
13600 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20  iCacheLevel);.  
13610 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
13620 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68  * Remove from th
13630 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61  e column cache a
13640 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ny entries that 
13650 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65  were added since
13660 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76   the.** the prev
13670 69 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72  ious sqlite3Expr
13680 43 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74  CachePush operat
13690 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
136a0 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a  ords, restore.**
136b0 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68   the cache to th
136c0 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
136d0 6e 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74  n prior the most
136e0 20 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f   recent Push..*/
136f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
13700 72 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20  rCachePop(Parse 
13710 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
13720 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
13730 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65  Cache *p;.  asse
13740 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
13750 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20  heLevel>=1 );.  
13760 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
13770 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51  vel--;.#ifdef SQ
13780 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
13790 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
137a0 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
137b0 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
137c0 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20 74    printf("POP  t
137d0 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d  o %d\n", pParse-
137e0 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20  >iCacheLevel);. 
137f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
13800 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
13810 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
13820 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
13830 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
13840 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e  ( p->iReg && p->
13850 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69  iLevel>pParse->i
13860 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20  CacheLevel ){.  
13870 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
13880 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
13890 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
138a0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
138b0 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63  /*.** When a cac
138c0 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65  hed column is re
138d0 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20  used, make sure 
138e0 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65  that its registe
138f0 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  r is.** no longe
13900 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61  r available as a
13910 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20   temp register. 
13920 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20   ticket #3879:  
13930 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67  that same.** reg
13940 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69  ister might be i
13950 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d  n the cache in m
13960 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20  ultiple places, 
13970 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a  so be sure to.**
13980 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a   get them all..*
13990 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
139a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
139b0 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20  nRegister(Parse 
139c0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
139d0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
139e0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
139f0 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
13a00 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
13a10 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
13a20 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
13a30 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
13a40 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
13a50 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
13a60 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
13a70 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
13a80 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74  ode to extract t
13a90 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
13aa0 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
13ab0 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  f a table..*/.vo
13ac0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
13ad0 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
13ae0 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  le(.  Vdbe *v,  
13af0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
13b00 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  E under construc
13b10 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20  tion */.  Table 
13b20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65  *pTab,    /* The
13b30 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
13b40 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20  g the value */. 
13b50 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
13b60 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75   /* The table cu
13b70 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b  rsor.  Or the PK
13b80 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48   cursor for WITH
13b90 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69  OUT ROWID */.  i
13ba0 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f  nt iCol,       /
13bb0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
13bc0 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
13bd0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
13be0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
13bf0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20   the value into 
13c00 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
13c10 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30  .){.  if( iCol<0
13c20 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e   || iCol==pTab->
13c30 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  iPKey ){.    sql
13c40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13c50 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
13c60 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Cur, regOut);.  
13c70 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f  }else{.    int o
13c80 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54  p = IsVirtual(pT
13c90 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e  ab) ? OP_VColumn
13ca0 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20   : OP_Column;.  
13cb0 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a    int x = iCol;.
13cc0 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
13cd0 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
13ce0 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
13cf0 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65  mnOfIndex(sqlite
13d00 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
13d10 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20  (pTab), iCol);. 
13d20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13d30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
13d40 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65  , iTabCur, x, re
13d50 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  gOut);.  }.  if(
13d60 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
13d70 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
13d80 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43  ault(v, pTab, iC
13d90 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
13da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
13db0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
13dc0 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43  l extract the iC
13dd0 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
13de0 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54  from.** table pT
13df0 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ab and store the
13e00 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
13e10 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e   a register.  An
13e20 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61   effort.** is ma
13e30 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  de to store the 
13e40 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
13e50 72 65 67 69 73 74 65 72 20 69 52 65 67 2c 20 62  register iReg, b
13e60 75 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f  ut this is.** no
13e70 74 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54  t guaranteed.  T
13e80 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
13e90 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
13ea0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
13eb0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
13ec0 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
13ed0 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c  to pTab in iTabl
13ee0 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
13ef0 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
13f00 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20  .  If iColumn<0 
13f10 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e  then code is gen
13f20 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72  erated that extr
13f30 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a  acts the rowid..
13f40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
13f50 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
13f60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
13f70 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
13f80 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
13f90 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13fa0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
13fb0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
13fc0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
13fd0 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
13fe0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
13ff0 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
14000 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
14010 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
14020 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
14030 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
14040 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
14050 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20  .  int iReg,    
14060 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
14070 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75  ults here */.  u
14080 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20  8 p5            
14090 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20  /* P5 value for 
140a0 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a  OP_Column */.){.
140b0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
140c0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
140d0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
140e0 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
140f0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
14100 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
14110 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
14120 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
14130 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26  if( p->iReg>0 &&
14140 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62   p->iTable==iTab
14150 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  le && p->iColumn
14160 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
14170 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
14180 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
14190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
141a0 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
141b0 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52  er(pParse, p->iR
141c0 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  eg);.      retur
141d0 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  n p->iReg;.    }
141e0 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28  .  }  .  assert(
141f0 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
14200 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
14210 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
14220 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  ab, iTable, iCol
14230 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66  umn, iReg);.  if
14240 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( p5 ){.    sqli
14250 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
14260 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b  v, p5);.  }else{
14270 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45     .    sqlite3E
14280 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
14290 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43  arse, iTable, iC
142a0 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
142b0 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
142c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
142d0 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  all column cache
142e0 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69   entries..*/.voi
142f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
14300 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  heClear(Parse *p
14310 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Parse){.  int i;
14320 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
14330 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53 51 4c  che *p;..#if SQL
14340 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
14350 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
14360 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
14370 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
14380 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e   printf("CLEAR\n
14390 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
143a0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
143b0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
143c0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
143d0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
143e0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29     if( p->iReg )
143f0 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
14400 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
14410 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  p);.      p->iRe
14420 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
14430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
14440 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61   the fact that a
14450 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  n affinity chang
14460 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f  e has occurred o
14470 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69  n iCount.** regi
14480 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
14490 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76  ith iStart..*/.v
144a0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
144b0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
144c0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
144d0 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e  , int iStart, in
144e0 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c  t iCount){.  sql
144f0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
14500 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61  ove(pParse, iSta
14510 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a  rt, iCount);.}..
14520 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
14530 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74  ode to move cont
14540 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ent from registe
14550 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d  rs iFrom...iFrom
14560 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20  +nReg-1.** over 
14570 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67  to iTo..iTo+nReg
14580 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c  -1. Keep the col
14590 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d  umn cache up-to-
145a0 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  date..*/.void sq
145b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
145c0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
145d0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
145e0 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  iTo, int nReg){.
145f0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
14600 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
14610 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e    assert( iFrom>
14620 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72  =iTo+nReg || iFr
14630 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a  om+nReg<=iTo );.
14640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14650 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op3(pParse->pVdb
14660 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f  e, OP_Move, iFro
14670 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20  m, iTo, nReg);. 
14680 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
14690 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
146a0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
146b0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
146c0 20 20 20 69 6e 74 20 78 20 3d 20 70 2d 3e 69 52     int x = p->iR
146d0 65 67 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 69  eg;.    if( x>=i
146e0 46 72 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b  From && x<iFrom+
146f0 6e 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d  nReg ){.      p-
14700 3e 69 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72  >iReg += iTo-iFr
14710 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  om;.    }.  }.}.
14720 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
14730 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
14740 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56  fined(SQLITE_COV
14750 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  ERAGE_TEST)./*.*
14760 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
14770 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e   any register in
14780 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d   the range iFrom
14790 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65  ..iTo (inclusive
147a0 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20  ).** is used as 
147b0 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  part of the colu
147c0 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  mn cache..**.** 
147d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
147e0 75 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65  used within asse
147f0 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73  rt() and testcas
14800 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a  e() macros only.
14810 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ** and does not 
14820 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d  appear in a norm
14830 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  al build..*/.sta
14840 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f  tic int usedAsCo
14850 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20  lumnCache(Parse 
14860 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
14870 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
14880 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
14890 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
148a0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
148b0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
148c0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
148d0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
148e0 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65    int r = p->iRe
148f0 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46  g;.    if( r>=iF
14900 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20  rom && r<=iTo ) 
14910 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e  return 1;    /*N
14920 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72  O_TEST*/.  }.  r
14930 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
14940 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
14950 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45  G || SQLITE_COVE
14960 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a  RAGE_TEST */../*
14970 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 65  .** Convert an e
14980 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74  xpression node t
14990 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  o a TK_REGISTER.
149a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
149b0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78  xprToRegister(Ex
149c0 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29  pr *p, int iReg)
149d0 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e  {.  p->op2 = p->
149e0 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  op;.  p->op = TK
149f0 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e  _REGISTER;.  p->
14a00 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20  iTable = iReg;. 
14a10 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
14a20 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a  ty(p, EP_Skip);.
14a30 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
14a40 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
14a50 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
14a60 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
14a70 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
14a80 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  .  Attempt to st
14a90 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
14aa0 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72  in register "tar
14ab0 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  get"..** Return 
14ac0 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  the register whe
14ad0 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  re results are s
14ae0 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  tored..**.** Wit
14af0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  h this routine, 
14b00 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72  there is no guar
14b10 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c  antee that resul
14b20 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74  ts will.** be st
14b30 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20  ored in target. 
14b40 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68   The result migh
14b50 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73  t be stored in s
14b60 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67  ome other.** reg
14b70 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63  ister if it is c
14b80 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20  onvenient to do 
14b90 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  so.  The calling
14ba0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
14bb0 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
14bc0 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65  rn code and move
14bd0 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
14be0 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72  the desired.** r
14bf0 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
14c00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14c10 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61  arget(Parse *pPa
14c20 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
14c30 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
14c40 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
14c50 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68  e->pVdbe;  /* Th
14c60 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e VM under const
14c70 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
14c80 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
14c90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
14ca0 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
14cb0 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20   */.  int inReg 
14cc0 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20  = target;       
14cd0 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65  /* Results store
14ce0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e  d in register in
14cf0 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  Reg */.  int reg
14d00 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20  Free1 = 0;      
14d10 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
14d20 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
14d30 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
14d40 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  /.  int regFree2
14d50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
14d60 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
14d70 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
14d80 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
14d90 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72  nt r1, r2, r3, r
14da0 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  4;       /* Vari
14db0 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ous register num
14dc0 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  bers */.  sqlite
14dd0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
14de0 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
14df0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
14e00 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20  /.  Expr tempX; 
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14e20 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65   Temporary expre
14e30 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 0a 20  ssion node */.. 
14e40 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
14e50 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
14e60 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
14e70 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61  f( v==0 ){.    a
14e80 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
14e90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14ea0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
14eb0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70  .  }..  if( pExp
14ec0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d  r==0 ){.    op =
14ed0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73   TK_NULL;.  }els
14ee0 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70  e{.    op = pExp
14ef0 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69  r->op;.  }.  swi
14f00 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
14f10 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
14f20 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
14f30 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
14f40 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
14f50 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
14f60 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
14f70 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
14f80 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20  [pExpr->iAgg];. 
14f90 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e       if( !pAggIn
14fa0 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29  fo->directMode )
14fb0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
14fc0 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29  ( pCol->iMem>0 )
14fd0 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
14fe0 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20  = pCol->iMem;.  
14ff0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15000 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67     }else if( pAg
15010 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e  gInfo->useSortin
15020 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  gIdx ){.        
15030 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15040 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
15050 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e  pAggInfo->sortin
15060 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20  gIdxPTab,.      
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
15090 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72  orterColumn, tar
150a0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  get);.        br
150b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
150c0 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c     /* Otherwise,
150d0 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20   fall thru into 
150e0 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61  the TK_COLUMN ca
150f0 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
15100 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
15110 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62  {.      int iTab
15120 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
15130 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62  ;.      if( iTab
15140 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  <0 ){.        if
15150 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65  ( pParse->ckBase
15160 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
15170 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48  /* Generating CH
15180 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
15190 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74  or inserting int
151a0 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  o partial index 
151b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 52  */.          inR
151c0 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  eg = pExpr->iCol
151d0 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b  umn + pParse->ck
151e0 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Base;.          
151f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
15200 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15210 2f 2a 20 44 65 6c 65 74 69 6e 67 20 66 72 6f 6d  /* Deleting from
15220 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
15230 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54   */.          iT
15240 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 61  ab = pParse->iPa
15250 72 74 49 64 78 54 61 62 3b 0a 20 20 20 20 20 20  rtIdxTab;.      
15260 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15270 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
15280 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
15290 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mn(pParse, pExpr
152a0 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152c0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
152d0 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72  olumn, iTab, tar
152e0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15300 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b      pExpr->op2);
15310 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15320 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
15330 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
15340 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
15350 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
15360 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
15370 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
15380 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
15390 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
153a0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
153b0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
153c0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
153d0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
153e0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
153f0 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
15400 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
15410 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
15420 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
15430 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  f.    case TK_ST
15440 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
15450 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
15460 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
15470 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
15480 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15490 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
154a0 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20  ng8, 0, target, 
154b0 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
154c0 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  en, 0);.      br
154d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
154e0 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
154f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15500 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
15510 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
15520 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15530 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
15540 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
15550 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
15560 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
15570 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
15580 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
15590 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
155a0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
155b0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
155c0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
155d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
155e0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
155f0 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72  0]=='x' || pExpr
15600 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
15610 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
15620 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
15630 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ken[1]=='\'' );.
15640 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72        z = &pExpr
15650 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
15660 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
15670 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b  Strlen30(z) - 1;
15680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
15690 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [n]=='\'' );.   
156a0 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
156b0 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
156c0 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
156d0 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
156e0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
156f0 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
15700 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
15710 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
15720 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15730 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
15740 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
15750 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
15760 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
15770 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
15780 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
15790 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
157a0 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
157b0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
157c0 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
157d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
157e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61  eAddOp2(v, OP_Va
157f0 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
15800 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
15810 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
15820 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30  ->u.zToken[1]!=0
15830 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
15840 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
15850 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20  ken[0]=='?' .   
15860 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72            || str
15870 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  cmp(pExpr->u.zTo
15880 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  ken, pParse->azV
15890 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
158a0 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20  n-1])==0 );.    
158b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
158c0 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70  hangeP4(v, -1, p
158d0 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78  Parse->azVar[pEx
158e0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20  pr->iColumn-1], 
158f0 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
15900 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
15910 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15920 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
15930 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
15940 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
15950 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
15960 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
15970 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
15980 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
15990 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
159a0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
159b0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
159c0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
159d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
159e0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
159f0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
15a00 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
15a10 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
15a20 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
15a30 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74        int aff, t
15a40 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52 65  o_op;.      inRe
15a50 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
15a60 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
15a70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
15a80 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61  target);.      a
15a90 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
15aa0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
15ab0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
15ac0 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
15ad0 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
15ae0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
15af0 30 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20  0);.      to_op 
15b00 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41  = aff - SQLITE_A
15b10 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54  FF_TEXT + OP_ToT
15b20 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ext;.      asser
15b30 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54  t( to_op==OP_ToT
15b40 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  ext    || aff!=S
15b50 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
15b60 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
15b70 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42  t( to_op==OP_ToB
15b80 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  lob    || aff!=S
15b90 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20  QLITE_AFF_NONE  
15ba0 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
15bb0 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e  t( to_op==OP_ToN
15bc0 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53  umeric || aff!=S
15bd0 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
15be0 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  C );.      asser
15bf0 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49  t( to_op==OP_ToI
15c00 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  nt     || aff!=S
15c10 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
15c20 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
15c30 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52  t( to_op==OP_ToR
15c40 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  eal    || aff!=S
15c50 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
15c60 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63    );.      testc
15c70 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
15c80 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20 20 74  oText );.      t
15c90 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
15ca0 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20 20  OP_ToBlob );.   
15cb0 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
15cc0 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63  op==OP_ToNumeric
15cd0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15ce0 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
15cf0 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Int );.      tes
15d00 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
15d10 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20  _ToReal );.     
15d20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
15d30 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
15d40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15d50 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  v, OP_SCopy, inR
15d60 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
15d70 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
15d80 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  get;.      }.   
15d90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15da0 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 69  dOp1(v, to_op, i
15db0 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74 65 73  nReg);.      tes
15dc0 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c  tcase( usedAsCol
15dd0 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
15de0 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29   inReg, inReg) )
15df0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15e00 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
15e10 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
15e20 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  nReg, 1);.      
15e30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
15e40 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
15e50 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63  IT_CAST */.    c
15e60 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
15e70 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
15e80 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
15e90 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
15ea0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
15eb0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
15ec0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
15ed0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15ee0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15ef0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
15f00 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
15f10 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15f20 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
15f30 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
15f40 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
15f50 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
15f60 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
15f70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
15f90 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
15fa0 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
15fb0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
15fc0 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
15fd0 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
15fe0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
15ff0 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
16000 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
16010 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
16020 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
16030 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
16040 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
16050 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
16060 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
16070 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
16080 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
16090 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
160a0 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
160b0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
160c0 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
160d0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
160e0 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
160f0 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
16100 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
16110 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Eq); VdbeCovera
16120 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71  geIf(v,op==OP_Eq
16130 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16140 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
16150 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
16160 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
16170 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
16180 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16190 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
161a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
161b0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
161c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
161d0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
161e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
161f0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
16200 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
16210 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16220 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  se( op==TK_ISNOT
16230 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
16240 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
16250 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
16260 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
16270 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
16280 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
16290 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
162a0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
162b0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20  ree2);.      op 
162c0 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
162d0 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
162e0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
162f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
16300 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
16310 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
16320 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
16330 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
16340 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c 49  E_STOREP2 | SQLI
16350 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
16360 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
16370 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a  (v, op==TK_EQ);.
16380 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
16390 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
163a0 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  E);.      testca
163b0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
163c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
163d0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
163e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
163f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
16400 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
16410 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
16420 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
16430 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
16440 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
16450 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
16460 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
16470 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
16480 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
16490 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
164a0 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
164b0 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
164c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
164d0 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
164e0 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
164f0 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  And );          
16500 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16510 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
16520 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
16530 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20  P_Or );         
16540 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
16550 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20  p==TK_OR );.    
16560 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
16570 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20  S==OP_Add );    
16580 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
16590 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
165a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
165b0 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
165c0 61 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63  act );     testc
165d0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55  ase( op==TK_MINU
165e0 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
165f0 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
16600 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20  mainder );      
16610 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
16620 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  _REM );.      as
16630 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d  sert( TK_BITAND=
16640 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20  =OP_BitAnd );   
16650 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
16660 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20  =TK_BITAND );.  
16670 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
16680 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29  ITOR==OP_BitOr )
16690 3b 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  ;        testcas
166a0 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20  e( op==TK_BITOR 
166b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
166c0 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
166d0 76 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65  vide );       te
166e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
166f0 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73  LASH );.      as
16700 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
16710 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
16720 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
16730 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20  =TK_LSHIFT );.  
16740 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
16750 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
16760 69 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73  ight );  testcas
16770 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
16780 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16790 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f  ( TK_CONCAT==OP_
167a0 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74  Concat );      t
167b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
167c0 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20  CONCAT );.      
167d0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
167e0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
167f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
16800 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
16810 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
16820 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
16830 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
16840 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
16850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16860 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20  dOp3(v, op, r2, 
16870 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
16880 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16890 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
168a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
168b0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
168c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
168d0 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
168e0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
168f0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
16900 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
16910 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
16920 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
16930 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
16940 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
16950 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ger(pParse, pLef
16960 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23  t, 1, target);.#
16970 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16980 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
16990 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  T.      }else if
169a0 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
169b0 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
169c0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
169d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
169e0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
169f0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
16a00 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54  l(v, pLeft->u.zT
16a10 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29  oken, 1, target)
16a20 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
16a30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
16a40 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45  mpX.op = TK_INTE
16a50 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  GER;.        tem
16a60 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e  pX.flags = EP_In
16a70 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f  tValue|EP_TokenO
16a80 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  nly;.        tem
16a90 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b  pX.u.iValue = 0;
16aa0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
16ab0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
16ac0 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58  p(pParse, &tempX
16ad0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
16ae0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
16af0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
16b00 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
16b10 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  eft, &regFree2);
16b20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16b30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16b40 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72  _Subtract, r2, r
16b50 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
16b60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
16b70 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
16b80 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
16b90 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
16ba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16bb0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
16bc0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
16bd0 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
16be0 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50  t( TK_BITNOT==OP
16bf0 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73  _BitNot );   tes
16c00 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
16c10 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73  TNOT );.      as
16c20 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
16c30 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20  _Not );         
16c40 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
16c50 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  _NOT );.      r1
16c60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16c70 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
16c80 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
16c90 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
16ca0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16cb0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e  1==0 );.      in
16cc0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
16cd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16ce0 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
16cf0 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62   inReg);.      b
16d00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
16d10 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
16d20 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
16d30 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
16d40 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73   addr;.      ass
16d50 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
16d60 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
16d70 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
16d80 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
16d90 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
16da0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
16db0 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
16dc0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
16dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16de0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
16df0 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
16e00 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
16e10 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16e20 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16e30 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
16e40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16e50 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
16e60 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
16e70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16e80 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
16e90 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
16ea0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
16eb0 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
16ec0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
16ed0 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
16ee0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16ef0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
16f00 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  er, 0, target);.
16f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16f20 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
16f30 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
16f40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16f50 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
16f60 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
16f70 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d   *pInfo = pExpr-
16f80 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
16f90 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b   if( pInfo==0 ){
16fa0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16fb0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
16fc0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
16fd0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
16fe0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16ff0 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
17000 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
17010 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  s()", pExpr->u.z
17020 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
17030 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52  lse{.        inR
17040 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  eg = pInfo->aFun
17050 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69  c[pExpr->iAgg].i
17060 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Mem;.      }.   
17070 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17080 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
17090 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
170a0 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20  prList *pFarg;  
170b0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
170c0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
170d0 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
170e0 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20  nFarg;          
170f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17100 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
17110 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63  ts */.      Func
17120 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20  Def *pDef;      
17130 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
17140 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62  on definition ob
17150 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ject */.      in
17160 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
17170 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
17180 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  f the function n
17190 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
171a0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
171b0 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
171c0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
171d0 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63  e */.      u32 c
171e0 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
171f0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
17200 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
17210 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
17220 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
17230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17240 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
17250 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e  r */.      u8 en
17260 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  c = ENC(db);    
17270 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e    /* The text en
17280 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74  coding used by t
17290 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
172a0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
172b0 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Coll = 0;    /* 
172c0 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  A collating sequ
172d0 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61  ence */..      a
172e0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
172f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
17300 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
17310 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
17320 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17330 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
17340 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
17350 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
17360 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
17370 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
17380 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17390 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20  nFarg = pFarg ? 
173a0 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30  pFarg->nExpr : 0
173b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
173c0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
173d0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
173e0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49  lue) );.      zI
173f0 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  d = pExpr->u.zTo
17400 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d  ken;.      nId =
17410 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
17420 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65  (zId);.      pDe
17430 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
17440 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c  unction(db, zId,
17450 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63   nId, nFarg, enc
17460 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
17470 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
17480 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
17490 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
174a0 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  own function: %.
174b0 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29  *s()", nId, zId)
174c0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
174d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
174e0 66 28 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d  f( pDef->xFunc==
174f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
17500 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17510 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
17520 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
17530 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20  on: %.*s()",.   
17540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17550 20 20 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a       nId, zId);.
17560 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17570 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
17580 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63   Attempt a direc
17590 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
175a0 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   of the built-in
175b0 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a   COALESCE() and.
175c0 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28        ** IFNULL(
175d0 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  ) functions.  Th
175e0 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65  is avoids unnece
175f0 73 73 61 72 79 20 65 76 61 6c 61 74 69 6f 6e 20  ssary evalation 
17600 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  of.      ** argu
17610 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66  ments past the f
17620 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72  irst non-NULL ar
17630 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
17640 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
17650 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
17660 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
17670 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
17680 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73   endCoalesce = s
17690 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
176a0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
176b0 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32  assert( nFarg>=2
176c0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
176d0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
176e0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
176f0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
17700 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
17710 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
17720 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17730 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17740 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65  P_NotNull, targe
17750 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  t, endCoalesce);
17760 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
17770 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17780 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17790 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
177a0 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b  rse, target, 1);
177b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
177c0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
177d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
177e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
177f0 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  de(pParse, pFarg
17800 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[i].pExpr, ta
17810 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rget);.         
17820 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
17830 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
17840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17850 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17860 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f  veLabel(v, endCo
17870 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20  alesce);.       
17880 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17890 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e  .      /* The UN
178a0 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f  LIKELY() functio
178b0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54  n is a no-op.  T
178c0 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65  he result is the
178d0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20   value.      ** 
178e0 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  of the first arg
178f0 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ument..      */.
17900 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
17910 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
17920 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59  TE_FUNC_UNLIKELY
17930 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
17940 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a  rt( nFarg>=1 );.
17950 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17960 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
17970 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
17980 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
17990 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
179a0 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   }..      for(i=
179b0 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  0; i<nFarg; i++)
179c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  {.        if( i<
179d0 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  32 && sqlite3Exp
179e0 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72  rIsConstant(pFar
179f0 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  g->a[i].pExpr) )
17a00 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
17a10 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20  case( i==31 );. 
17a20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61           constMa
17a30 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28  sk |= MASKBIT32(
17a40 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
17a50 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
17a60 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
17a70 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
17a80 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20  L)!=0 && !pColl 
17a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
17aa0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
17ab0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
17ac0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
17ad0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
17ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
17af0 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  pFarg ){.       
17b00 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29   if( constMask )
17b10 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  {.          r1 =
17b20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
17b30 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
17b40 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67  e->nMem += nFarg
17b50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
17b60 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
17b70 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
17b80 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72  nge(pParse, nFar
17b90 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  g);.        }.. 
17ba0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65         /* For le
17bb0 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f  ngth() and typeo
17bc0 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69  f() functions wi
17bd0 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75  th a column argu
17be0 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ment,.        **
17bf0 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61   set the P5 para
17c00 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f  meter to the OP_
17c10 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f  Column opcode to
17c20 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
17c30 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  G.        ** or 
17c40 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
17c50 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74   respectively, t
17c60 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
17c70 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20  ary data.       
17c80 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20   ** loading..   
17c90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17ca0 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
17cb0 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46  lags & (SQLITE_F
17cc0 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54  UNC_LENGTH|SQLIT
17cd0 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21  E_FUNC_TYPEOF))!
17ce0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17cf0 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20  u8 exprOp;.     
17d00 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
17d10 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg==1 );.       
17d20 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67     assert( pFarg
17d30 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
17d40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  );.          exp
17d50 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30  rOp = pFarg->a[0
17d60 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20  ].pExpr->op;.   
17d70 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f         if( exprO
17d80 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
17d90 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43  exprOp==TK_AGG_C
17da0 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
17db0 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
17dc0 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d  ITE_FUNC_LENGTH=
17dd0 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  =OPFLAG_LENGTHAR
17de0 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
17df0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
17e00 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46  FUNC_TYPEOF==OPF
17e10 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b  LAG_TYPEOFARG );
17e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
17e30 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e  tcase( pDef->fun
17e40 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  cFlags & OPFLAG_
17e50 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
17e60 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e           pFarg->
17e70 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20  a[0].pExpr->op2 
17e80 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
17e90 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46       pDef->funcF
17ea0 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c  lags & (OPFLAG_L
17eb0 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f  ENGTHARG|OPFLAG_
17ec0 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20  TYPEOFARG);.    
17ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17ee0 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  }..        sqlit
17ef0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
17f00 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
17f10 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33  Ticket 2ea2425d3
17f20 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  4be */.        s
17f30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
17f40 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
17f50 46 61 72 67 2c 20 72 31 2c 0a 20 20 20 20 20 20  Farg, r1,.      
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f70 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17f80 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45  _ECEL_DUP|SQLITE
17f90 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20  _ECEL_FACTOR);. 
17fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17fb0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
17fc0 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  e);      /* Tick
17fd0 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
17fe0 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
17ff0 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a          r1 = 0;.
18000 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
18010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
18020 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
18030 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
18040 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
18050 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
18060 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
18070 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
18080 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
18090 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
180a0 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
180b0 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
180c0 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
180d0 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
180e0 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
180f0 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
18100 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
18110 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
18120 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
18130 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
18140 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
18150 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
18160 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
18170 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
18180 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
18190 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
181a0 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
181b0 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
181c0 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
181d0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
181e0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
181f0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
18200 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
18210 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
18220 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
18230 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
18240 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
18250 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
18260 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
18270 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
18280 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
18290 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
182a0 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
182b0 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
182c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  */.      if( nFa
182d0 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  rg>=2 && (pExpr-
182e0 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
182f0 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
18300 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
18310 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
18320 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
18330 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31  Farg, pFarg->a[1
18340 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
18350 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e  }else if( nFarg>
18360 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
18370 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
18380 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
18390 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
183a0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
183b0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
183c0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44  dif.      if( pD
183d0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
183e0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
183f0 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
18400 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
18410 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
18420 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c  ll; .        sql
18430 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
18440 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
18450 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
18460 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
18470 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18480 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18490 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p4(v, OP_Functio
184a0 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31  n, constMask, r1
184b0 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184d0 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50    (char*)pDef, P
184e0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
184f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
18500 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61  ngeP5(v, (u8)nFa
18510 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  rg);.      if( n
18520 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73  Farg && constMas
18530 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
18540 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18550 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
18560 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  r1, nFarg);.    
18570 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
18580 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
18590 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
185a0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
185b0 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
185c0 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
185d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
185e0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
185f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
18600 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
18610 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
18620 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
18630 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
18640 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
18650 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
18660 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
18670 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
18680 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
18690 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
186a0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
186b0 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
186c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
186d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
186e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
186f0 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
18700 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18710 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
18720 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
18730 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
18740 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18750 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
18760 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
18770 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18780 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18790 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
187a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
187b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
187c0 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
187d0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
187e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
187f0 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
18800 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18810 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
18820 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
18830 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a  ERY */...    /*.
18840 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
18850 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
18860 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
18870 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
18880 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
18890 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
188a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
188b0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
188c0 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
188d0 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
188e0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
188f0 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
18900 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
18910 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
18920 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
18930 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
18940 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  WEEN: {.      Ex
18950 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
18960 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
18970 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
18980 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70  item *pLItem = p
18990 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
189a0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
189b0 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
189c0 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20  Expr;..      r1 
189d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
189e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
189f0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
18a00 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
18a10 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
18a20 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
18a30 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
18a40 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
18a50 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
18a60 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
18a70 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
18a80 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r3 = sqlite3GetT
18a90 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
18aa0 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74        r4 = sqlit
18ab0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
18ac0 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  rse);.      code
18ad0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
18ae0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
18af0 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20  P_Ge,.          
18b00 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
18b10 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r3, SQLITE_STORE
18b20 50 32 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  P2);  VdbeCovera
18b30 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 49  ge(v);.      pLI
18b40 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69  tem++;.      pRi
18b50 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
18b60 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
18b70 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18b80 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
18b90 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  2);.      r2 = s
18ba0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
18bb0 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  mp(pParse, pRigh
18bc0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
18bd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
18be0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
18bf0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
18c00 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
18c10 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31  Right, OP_Le, r1
18c20 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45  , r2, r4, SQLITE
18c30 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
18c40 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18c50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18c60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
18c70 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72  And, r3, r4, tar
18c80 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
18c90 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18ca0 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20  g(pParse, r3);. 
18cb0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
18cc0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
18cd0 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72  e, r4);.      br
18ce0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
18cf0 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20  ase TK_COLLATE: 
18d00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
18d10 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  US: {.      inRe
18d20 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
18d30 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
18d40 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
18d50 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
18d60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
18d70 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52   case TK_TRIGGER
18d80 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
18d90 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b  the opcode is TK
18da0 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74  _TRIGGER, then t
18db0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
18dc0 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20   a reference.   
18dd0 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d     ** to a colum
18de0 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f  n in the new.* o
18df0 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  r old.* pseudo-t
18e00 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
18e10 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67  to.      ** trig
18e20 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e  ger programs. In
18e30 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e   this case Expr.
18e40 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
18e50 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   1 for the.     
18e60 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f   ** new.* pseudo
18e70 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72  -table, or 0 for
18e80 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
18e90 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43  o-table. Expr.iC
18ea0 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69  olumn.      ** i
18eb0 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
18ec0 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64  umn of the pseud
18ed0 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c  o-table to read,
18ee0 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20   or to -1 to.   
18ef0 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72     ** read the r
18f00 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20  owid field..    
18f10 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
18f20 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
18f30 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
18f40 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70  g an OP_Param op
18f50 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20  code. The p1.   
18f60 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
18f70 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20  is set to 0 for 
18f80 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66  an old.rowid ref
18f90 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69  erence, or to (i
18fa0 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  +1).      ** to 
18fb0 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65  reference anothe
18fc0 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  r column of the 
18fd0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
18fe0 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20  le, where .     
18ff0 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
19000 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
19010 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69  . For a new.rowi
19020 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20  d reference, p1 
19030 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  is.      ** set 
19040 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20  to (n+1), where 
19050 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
19060 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61  of columns in ea
19070 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  ch pseudo-table.
19080 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
19090 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
190a0 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e   other column in
190b0 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64   the new.* pseud
190c0 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20  o-table, p1.    
190d0 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28    ** is set to (
190e0 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20  n+2+i), where n 
190f0 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66  and i are as def
19100 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e  ined previously.
19110 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78   For.      ** ex
19120 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
19130 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69  ble on which tri
19140 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20  ggers are being 
19150 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a  fired is.      *
19160 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20  * declared as:. 
19170 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
19180 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
19190 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
191a0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  **.      ** Then
191b0 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74   p1 is interpret
191c0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
191d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
191e0 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20     p1==0   ->   
191f0 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70   old.rowid     p
19200 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==3   ->    new
19210 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20  .rowid.      ** 
19220 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20    p1==1   ->    
19230 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31  old.a         p1
19240 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==4   ->    new.
19250 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  a.      **   p1=
19260 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62  =2   ->    old.b
19270 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20           p1==5  
19280 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20   ->    new.b    
19290 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20     .      */.   
192a0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
192b0 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
192c0 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
192d0 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
192e0 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
192f0 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
19300 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
19310 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
19320 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
19330 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
19340 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
19350 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
19360 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
19370 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
19380 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
19390 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
193a0 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
193b0 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
193c0 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
193d0 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
193e0 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
193f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19400 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
19410 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
19420 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
19430 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20  %s.%s -> $%d",. 
19440 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
19450 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
19460 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
19470 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
19480 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
19490 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  xpr->pTab->aCol[
194a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
194b0 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
194c0 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b  target.      ));
194d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
194e0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
194f0 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66  OINT.      /* If
19500 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
19510 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69  REAL affinity, i
19520 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  t may currently 
19530 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a  be stored as an.
19540 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
19550 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66  . Use OP_RealAff
19560 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75  inity to make su
19570 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  re it is really 
19580 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  real.  */.      
19590 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
195a0 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26  mn>=0 .       &&
195b0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70   pTab->aCol[pExp
195c0 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  r->iColumn].affi
195d0 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
195e0 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20  _REAL.      ){. 
195f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19600 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
19610 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72  ealAffinity, tar
19620 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  get);.      }.#e
19630 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
19640 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
19650 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
19660 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
19670 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
19680 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
19690 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
196a0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
196b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
196c0 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
196d0 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
196e0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
196f0 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
19700 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
19710 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
19720 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
19730 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
19740 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
19750 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
19760 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
19770 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
19780 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
19790 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
197a0 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
197b0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
197c0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
197d0 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
197e0 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
197f0 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
19800 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20   is in the last 
19810 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72  element of pExpr
19820 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78  ->x.pList if pEx
19830 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
19840 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64  pr is.    ** odd
19850 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
19860 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
19870 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
19880 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74  ments in x.pList
19890 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c  .    ** is even,
198a0 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74   then Y is omitt
198b0 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65  ed and the "othe
198c0 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73  rwise" result is
198d0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
198e0 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
198f0 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
19900 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
19910 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
19920 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
19930 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
19940 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
19950 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
19960 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
19970 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
19980 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
19990 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
199a0 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
199b0 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
199c0 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
199d0 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
199e0 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
199f0 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
19a00 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
19a30 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
19a40 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
19a50 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a70 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
19a80 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
19a90 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
19aa0 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
19ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ac0 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
19ad0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
19ae0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b00 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
19b10 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
19b20 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b40 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
19b50 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
19b60 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
19b70 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
19b80 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
19b90 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
19ba0 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
19bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19bc0 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
19bd0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
19be0 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
19c10 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
19c20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
19c30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
19c40 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
19c50 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
19c60 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20  Ei (form B) */. 
19c70 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69       VVA_ONLY( i
19c80 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d  nt iCacheLevel =
19c90 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
19ca0 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61  evel; )..      a
19cb0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
19cc0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
19cd0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20  P_xIsSelect) && 
19ce0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
19cf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
19d00 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
19d10 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
19d20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
19d30 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
19d40 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
19d50 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
19d60 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
19d70 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
19d80 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
19d90 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
19da0 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
19db0 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
19dc0 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20  {.        tempX 
19dd0 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74  = *pX;.        t
19de0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
19df0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
19e00 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69        exprToRegi
19e10 73 74 65 72 28 26 74 65 6d 70 58 2c 20 73 71 6c  ster(&tempX, sql
19e20 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
19e30 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65  (pParse, pX, &re
19e40 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20  gFree1));.      
19e50 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
19e60 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
19e70 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20     opCompare.op 
19e80 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20  = TK_EQ;.       
19e90 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74   opCompare.pLeft
19ea0 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20   = &tempX;.     
19eb0 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
19ec0 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f  mpare;.        /
19ed0 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35  * Ticket b351d95
19ee0 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61  f9cd5ef17e9d9dba
19ef0 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30  e18f5ca861119000
19f00 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  1:.        ** Th
19f10 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72  e value in regFr
19f20 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43  ee1 might get SC
19f30 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20  opy-ed into the 
19f40 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20  file result..   
19f50 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20       ** So make 
19f60 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
19f70 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20  gFree1 register 
19f80 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f  is not reused fo
19f90 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  r other.        
19fa0 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20  ** purposes and 
19fb0 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69  possibly overwri
19fc0 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20  tten.  */.      
19fd0 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a    regFree1 = 0;.
19fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
19ff0 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31  r(i=0; i<nExpr-1
1a000 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
1a010 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1a020 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1a030 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
1a040 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1a050 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a  rt( pTest!=0 );.
1a060 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
1a070 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
1a080 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
1a090 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1a0a0 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
1a0b0 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
1a0c0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
1a0d0 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
1a0e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1a0f0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1a100 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1a110 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
1a120 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
1a130 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1a140 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20  (pParse, pTest, 
1a150 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45  nextCase, SQLITE
1a160 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
1a170 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a180 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
1a190 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1a1a0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
1a1b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1a1c0 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
1a1d0 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
1a1e0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
1a1f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a200 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
1a210 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
1a220 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1a230 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1a240 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a250 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a260 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
1a270 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
1a280 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20  nExpr&1)!=0 ){. 
1a290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1a2a0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1a2b0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
1a2c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1a2d0 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e  rse, pEList->a[n
1a2e0 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74  Expr-1].pExpr, t
1a2f0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1a300 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1a310 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1a320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a330 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a340 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1a350 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1a360 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1a370 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1a380 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
1a390 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20  rr>0 .          
1a3a0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63   || pParse->iCac
1a3b0 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c  heLevel==iCacheL
1a3c0 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  evel );.      sq
1a3d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1a3e0 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65  Label(v, endLabe
1a3f0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1a400 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1a410 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
1a420 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
1a430 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  AISE: {.      as
1a440 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66  sert( pExpr->aff
1a450 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  inity==OE_Rollba
1a460 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ck .           |
1a470 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
1a480 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20  y==OE_Abort.    
1a490 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
1a4a0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61  >affinity==OE_Fa
1a4b0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  il.           ||
1a4c0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1a4d0 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20  ==OE_Ignore.    
1a4e0 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21    );.      if( !
1a4f0 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
1a500 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
1a510 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a520 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
1a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
1a540 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
1a550 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
1a560 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
1a570 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
1a580 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1a590 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
1a5a0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
1a5b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1a5c0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
1a5d0 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
1a5e0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1a5f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1a600 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1a610 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
1a620 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
1a630 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
1a640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a650 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20  ddOp4(.         
1a660 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53     v, OP_Halt, S
1a670 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e  QLITE_OK, OE_Ign
1a680 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75  ore, 0, pExpr->u
1a690 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20  .zToken,0);.    
1a6a0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a6b0 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
1a6c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a6d0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
1a6e0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43  pParse, SQLITE_C
1a6f0 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
1a700 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a720 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1a730 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1a740 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
1a750 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
1a760 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
1a770 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1a780 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1a790 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
1a7a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a7b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1a7c0 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
1a7d0 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
1a7e0 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63  Factor out the c
1a7f0 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ode of the given
1a800 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69   expression to i
1a810 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
1a820 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
1a830 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
1a840 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1a850 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
1a860 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1a870 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1a880 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1a890 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20  on to code when 
1a8a0 74 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c  the VDBE initial
1a8b0 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  izes */.  int re
1a8c0 67 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53  gDest,      /* S
1a8d0 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69  tore the value i
1a8e0 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
1a8f0 2a 2f 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65  */.  u8 reusable
1a900 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1a910 66 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  f this expressio
1a920 6e 20 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f  n is reusable */
1a930 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
1a940 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e  p;.  assert( Con
1a950 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
1a960 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  e) );.  p = pPar
1a970 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a  se->pConstExpr;.
1a980 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
1a990 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
1a9a0 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  >db, pExpr, 0);.
1a9b0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
1a9c0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1a9d0 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20  se, p, pExpr);. 
1a9e0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73   if( p ){.     s
1a9f0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1aa00 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
1aa10 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  >a[p->nExpr-1];.
1aa20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43       pItem->u.iC
1aa30 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65  onstExprReg = re
1aa40 67 44 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65  gDest;.     pIte
1aa50 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65  m->reusable = re
1aa60 75 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50  usable;.  }.  pP
1aa70 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
1aa80 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = p;.}../*.** G
1aa90 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1aaa0 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  evaluate an expr
1aab0 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  ession and store
1aac0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
1aad0 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
1aae0 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67    Return the reg
1aaf0 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
1ab00 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
1ab10 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  * are stored..**
1ab20 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73  .** If the regis
1ab30 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ter is a tempora
1ab40 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74  ry register that
1ab50 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61   can be dealloca
1ab60 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69  ted,.** then wri
1ab70 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e  te its number in
1ab80 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68  to *pReg.  If th
1ab90 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  e result registe
1aba0 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65  r is not.** a te
1abb0 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65  mporary, then se
1abc0 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e  t *pReg to zero.
1abd0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
1abe0 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74  is a constant, t
1abf0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1ac00 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20   might generate 
1ac10 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  this.** code to 
1ac20 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65  fill the registe
1ac30 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c  r in the initial
1ac40 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20  ization section 
1ac50 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  of the.** VDBE p
1ac60 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72  rogram, in order
1ac70 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75   to factor it ou
1ac80 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74  t of the evaluat
1ac90 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ion loop..*/.int
1aca0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1acb0 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72  Temp(Parse *pPar
1acc0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1acd0 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69   int *pReg){.  i
1ace0 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d  nt r2;.  pExpr =
1acf0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
1ad00 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a  Collate(pExpr);.
1ad10 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f    if( ConstFacto
1ad20 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26  rOk(pParse).   &
1ad30 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
1ad40 52 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73  REGISTER.   && s
1ad50 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1ad60 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
1ad70 72 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  r).  ){.    Expr
1ad80 4c 69 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65  List *p = pParse
1ad90 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  ->pConstExpr;.  
1ada0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52    int i;.    *pR
1adb0 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  eg  = 0;.    if(
1adc0 20 70 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75   p ){.      stru
1add0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1ade0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66   *pItem;.      f
1adf0 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69  or(pItem=p->a, i
1ae00 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20  =p->nExpr; i>0; 
1ae10 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20  pItem++, i--){. 
1ae20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
1ae30 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71  ->reusable && sq
1ae40 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1ae50 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45  (pItem->pExpr,pE
1ae60 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  xpr,-1)==0 ){.  
1ae70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1ae80 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78  Item->u.iConstEx
1ae90 70 72 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d  prReg;.        }
1aea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1aeb0 20 20 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65     r2 = ++pParse
1aec0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
1aed0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
1aee0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1aef0 20 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65   r2, 1);.  }else
1af00 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73  {.    int r1 = s
1af10 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1af20 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32  (pParse);.    r2
1af30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1af40 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1af50 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   pExpr, r1);.   
1af60 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20   if( r2==r1 ){. 
1af70 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b       *pReg = r1;
1af80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1af90 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1afa0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1afb0 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67  r1);.      *pReg
1afc0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1afd0 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a    return r2;.}..
1afe0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1aff0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
1b000 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
1b010 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
1b020 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
1b030 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
1b040 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
1b050 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
1b060 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
1b070 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1b080 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b090 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
1b0a0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1b0b0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1b0c0 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  ){.  int inReg;.
1b0d0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1b0e0 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
1b0f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
1b100 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45   if( pExpr && pE
1b110 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
1b120 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69  STER ){.    sqli
1b130 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
1b140 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1b150 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61  Copy, pExpr->iTa
1b160 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ble, target);.  
1b170 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67  }else{.    inReg
1b180 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1b190 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1b1a0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
1b1b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b1c0 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50  rse->pVdbe || pP
1b1d0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1b1e0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
1b1f0 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
1b200 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  && pParse->pVdbe
1b210 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1b220 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1b230 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
1b240 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
1b250 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  et);.    }.  }.}
1b260 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1b270 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1b280 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
1b290 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
1b2a0 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
1b2b0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
1b2c0 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
1b2d0 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
1b2e0 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
1b2f0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
1b300 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  et.  If the expr
1b310 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
1b320 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
1b330 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63  utine.** might c
1b340 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68  hoose to code th
1b350 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20  e expression at 
1b360 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
1b370 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
1b380 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
1b390 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  orable(Parse *pP
1b3a0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1b3b0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1b3c0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b    if( pParse->ok
1b3d0 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73  ConstFactor && s
1b3e0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1b3f0 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
1b400 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1b410 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
1b420 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
1b430 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
1b440 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b450 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1b460 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  target);.  }.}..
1b470 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1b480 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65  ode that evalute
1b490 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
1b4a0 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20  ession and puts 
1b4b0 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  the result.** in
1b4c0 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1b4d0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b  ..**.** Also mak
1b4e0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
1b4f0 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c  expression resul
1b500 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20  ts into another 
1b510 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72  "cache" register
1b520 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  .** and modify t
1b530 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
1b540 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74   that the next t
1b550 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61  ime it is evalua
1b560 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ted,.** the resu
1b570 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  lt is a copy of 
1b580 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74  the cache regist
1b590 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
1b5a0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
1b5b0 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  or expressions t
1b5c0 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c  hat are used mul
1b5d0 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e  tiple .** times.
1b5e0 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75    They are evalu
1b5f0 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68  ated once and th
1b600 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
1b610 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
1b620 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f  re reused..*/.vo
1b630 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1b640 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
1b650 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1b660 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
1b670 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
1b680 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1b690 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73   int iMem;..  as
1b6a0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
1b6b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1b6c0 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
1b6d0 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ER );.  sqlite3E
1b6e0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1b6f0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1b700 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73    iMem = ++pPars
1b710 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
1b720 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b730 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c  OP_Copy, target,
1b740 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f   iMem);.  exprTo
1b750 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20  Register(pExpr, 
1b760 69 4d 65 6d 29 3b 0a 7d 0a 0a 23 69 66 20 64 65  iMem);.}..#if de
1b770 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1b780 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
1b790 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  )./*.** Generate
1b7a0 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
1b7b0 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
1b7c0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
1b7d0 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ree..*/.void sql
1b7e0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1b7f0 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78 70 72  Vdbe *pOut, Expr
1b800 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
1b810 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1b820 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
1b830 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ode being coded 
1b840 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b850 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20 2f  *zBinOp = 0;   /
1b860 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61 74 6f  * Binary operato
1b870 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
1b880 72 20 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20 20  r *zUniOp = 0;  
1b890 20 2f 2a 20 55 6e 61 72 79 20 6f 70 65 72 61 74   /* Unary operat
1b8a0 6f 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  or */.  if( pExp
1b8b0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d  r==0 ){.    op =
1b8c0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73   TK_NULL;.  }els
1b8d0 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70  e{.    op = pExp
1b8e0 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69  r->op;.  }.  swi
1b8f0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1b900 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
1b910 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  N: {.      sqlit
1b920 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1b930 70 4f 75 74 2c 20 22 41 47 47 7b 25 64 3a 25 64  pOut, "AGG{%d:%d
1b940 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  }",.            
1b950 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70  pExpr->iTable, p
1b960 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
1b970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b980 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
1b990 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
1b9a0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
1b9b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
1b9c0 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
1b9d0 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63  ns when coding c
1b9e0 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73  heck constraints
1b9f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
1ba00 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1ba10 28 70 4f 75 74 2c 20 22 43 4f 4c 55 4d 4e 28 25  (pOut, "COLUMN(%
1ba20 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  d)", pExpr->iCol
1ba30 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
1ba40 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1ba50 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1ba60 70 4f 75 74 2c 20 22 7b 25 64 3a 25 64 7d 22 2c  pOut, "{%d:%d}",
1ba70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1ba90 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
1baa0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
1bab0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1bac0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1bad0 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
1bae0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1baf0 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
1bb00 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  alue ){.        
1bb10 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1bb20 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 64 22 2c  intf(pOut, "%d",
1bb30 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
1bb40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1bb50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1bb60 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1bb70 74 2c 20 22 25 73 22 2c 20 70 45 78 70 72 2d 3e  t, "%s", pExpr->
1bb80 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1bb90 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1bba0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1bbb0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1bbc0 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73  NG_POINT.    cas
1bbd0 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
1bbe0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1bbf0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
1bc00 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  s", pExpr->u.zTo
1bc10 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
1bc20 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1bc30 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
1bc40 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NG: {.      sqli
1bc50 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1bc60 28 70 4f 75 74 2c 22 25 51 22 2c 20 70 45 78 70  (pOut,"%Q", pExp
1bc70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1bc80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bc90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1bca0 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
1bcb0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1bcc0 70 4f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20  pOut,"NULL");.  
1bcd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bce0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bcf0 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
1bd00 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
1bd10 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OB: {.      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 22 25 73 22 2c 20 70 45 78 70  (pOut,"%s", pExp
1bd40 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1bd50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bd60 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1bd70 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
1bd80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bd90 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1bda0 22 56 41 52 49 41 42 4c 45 28 25 73 2c 25 64 29  "VARIABLE(%s,%d)
1bdb0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1bdd0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70  xpr->u.zToken, p
1bde0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
1bdf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1be00 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
1be10 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
1be20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1be30 72 69 6e 74 66 28 70 4f 75 74 2c 22 52 45 47 49  rintf(pOut,"REGI
1be40 53 54 45 52 28 25 64 29 22 2c 20 70 45 78 70 72  STER(%d)", pExpr
1be50 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
1be60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1be70 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a    case TK_AS: {.
1be80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1be90 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1bea0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1beb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bec0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bed0 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
1bee0 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
1bef0 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
1bf00 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
1bf10 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
1bf20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
1bf30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66  const char *zAff
1bf40 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20   = "unk";.      
1bf50 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 41  switch( sqlite3A
1bf60 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
1bf70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 20  r->u.zToken, 0) 
1bf80 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
1bf90 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a  SQLITE_AFF_TEXT:
1bfa0 20 20 20 20 7a 41 66 66 20 3d 20 22 54 45 58 54      zAff = "TEXT
1bfb0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1bfc0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1bfd0 45 5f 41 46 46 5f 4e 4f 4e 45 3a 20 20 20 20 7a  E_AFF_NONE:    z
1bfe0 41 66 66 20 3d 20 22 4e 4f 4e 45 22 3b 20 20 20  Aff = "NONE";   
1bff0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c000 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1c010 5f 4e 55 4d 45 52 49 43 3a 20 7a 41 66 66 20 3d  _NUMERIC: zAff =
1c020 20 22 4e 55 4d 45 52 49 43 22 3b 20 20 62 72 65   "NUMERIC";  bre
1c030 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1c040 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
1c050 47 45 52 3a 20 7a 41 66 66 20 3d 20 22 49 4e 54  GER: zAff = "INT
1c060 45 47 45 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20  EGER";  break;. 
1c070 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1c080 54 45 5f 41 46 46 5f 52 45 41 4c 3a 20 20 20 20  TE_AFF_REAL:    
1c090 7a 41 66 66 20 3d 20 22 52 45 41 4c 22 3b 20 20  zAff = "REAL";  
1c0a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c0b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
1c0c0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1c0d0 74 2c 20 22 43 41 53 54 2d 25 73 28 22 2c 20 7a  t, "CAST-%s(", z
1c0e0 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Aff);.      sqli
1c0f0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1c100 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Out, pExpr->pLef
1c110 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1c120 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1c130 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20  Out, ")");.     
1c140 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1c150 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1c160 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
1c170 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
1c180 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 54 22 3b 20   zBinOp = "LT"; 
1c190 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1c1a0 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20  ase TK_LE:      
1c1b0 7a 42 69 6e 4f 70 20 3d 20 22 4c 45 22 3b 20 20  zBinOp = "LE";  
1c1c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1c1d0 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a  se TK_GT:      z
1c1e0 42 69 6e 4f 70 20 3d 20 22 47 54 22 3b 20 20 20  BinOp = "GT";   
1c1f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1c200 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42  e TK_GE:      zB
1c210 69 6e 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20  inOp = "GE";    
1c220 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c230 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 42 69   TK_NE:      zBi
1c240 6e 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20  nOp = "NE";     
1c250 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c260 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a 42 69 6e  TK_EQ:      zBin
1c270 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20 62  Op = "EQ";     b
1c280 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1c290 4b 5f 49 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_IS:      zBinO
1c2a0 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 62 72  p = "IS";     br
1c2b0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1c2c0 5f 49 53 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70  _ISNOT:   zBinOp
1c2d0 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 62 72 65   = "ISNOT";  bre
1c2e0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1c2f0 41 4e 44 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20  AND:     zBinOp 
1c300 3d 20 22 41 4e 44 22 3b 20 20 20 20 62 72 65 61  = "AND";    brea
1c310 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  k;.    case TK_O
1c320 52 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  R:      zBinOp =
1c330 20 22 4f 52 22 3b 20 20 20 20 20 62 72 65 61 6b   "OR";     break
1c340 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  ;.    case TK_PL
1c350 55 53 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  US:    zBinOp = 
1c360 22 41 44 44 22 3b 20 20 20 20 62 72 65 61 6b 3b  "ADD";    break;
1c370 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
1c380 52 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  R:    zBinOp = "
1c390 4d 55 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  MUL";    break;.
1c3a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
1c3b0 53 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 53  S:   zBinOp = "S
1c3c0 55 42 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  UB";    break;. 
1c3d0 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20     case TK_REM: 
1c3e0 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 45      zBinOp = "RE
1c3f0 4d 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  M";    break;.  
1c400 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
1c410 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54  :  zBinOp = "BIT
1c420 41 4e 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  AND"; break;.   
1c430 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20   case TK_BITOR: 
1c440 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 4f    zBinOp = "BITO
1c450 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  R";  break;.    
1c460 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20  case TK_SLASH:  
1c470 20 7a 42 69 6e 4f 70 20 3d 20 22 44 49 56 22 3b   zBinOp = "DIV";
1c480 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1c490 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20  ase TK_LSHIFT:  
1c4a0 7a 42 69 6e 4f 70 20 3d 20 22 4c 53 48 49 46 54  zBinOp = "LSHIFT
1c4b0 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1c4c0 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a  se TK_RSHIFT:  z
1c4d0 42 69 6e 4f 70 20 3d 20 22 52 53 48 49 46 54 22  BinOp = "RSHIFT"
1c4e0 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
1c4f0 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42  e TK_CONCAT:  zB
1c500 69 6e 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b  inOp = "CONCAT";
1c510 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
1c520 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 55  e TK_UMINUS:  zU
1c530 6e 69 4f 70 20 3d 20 22 55 4d 49 4e 55 53 22 3b  niOp = "UMINUS";
1c540 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c550 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 55 6e   TK_UPLUS:   zUn
1c560 69 4f 70 20 3d 20 22 55 50 4c 55 53 22 3b 20 20  iOp = "UPLUS";  
1c570 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c580 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 55 6e 69  TK_BITNOT:  zUni
1c590 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 62  Op = "BITNOT"; b
1c5a0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1c5b0 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 55 6e 69 4f  K_NOT:     zUniO
1c5c0 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 62 72  p = "NOT";    br
1c5d0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1c5e0 5f 49 53 4e 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70  _ISNULL:  zUniOp
1c5f0 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 62 72 65   = "ISNULL"; bre
1c600 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1c610 4e 4f 54 4e 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20  NOTNULL: zUniOp 
1c620 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65  = "NOTNULL"; bre
1c630 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  ak;..    case TK
1c640 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20  _COLLATE: {.    
1c650 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c660 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1c670 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
1c680 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1c690 69 6e 74 66 28 70 4f 75 74 2c 22 2e 43 4f 4c 4c  intf(pOut,".COLL
1c6a0 41 54 45 28 25 73 29 22 2c 70 45 78 70 72 2d 3e  ATE(%s)",pExpr->
1c6b0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1c6c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1c6d0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
1c6e0 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
1c6f0 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
1c700 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
1c710 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a  *pFarg;       /*
1c720 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   List of functio
1c730 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
1c740 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1c750 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1c760 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
1c770 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1c780 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1c790 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1c7a0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1c7b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c7c0 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  f( op==TK_AGG_FU
1c7d0 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  NCTION ){.      
1c7e0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c7f0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 41 47  Printf(pOut, "AG
1c800 47 5f 46 55 4e 43 54 49 4f 4e 25 64 3a 25 73 28  G_FUNCTION%d:%s(
1c810 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c830 70 45 78 70 72 2d 3e 6f 70 32 2c 20 70 45 78 70  pExpr->op2, pExp
1c840 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1c850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c860 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c870 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 46  nPrintf(pOut, "F
1c880 55 4e 43 54 49 4f 4e 3a 25 73 28 22 2c 20 70 45  UNCTION:%s(", pE
1c890 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1c8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c8b0 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
1c8c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c8d0 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20  nExprList(pOut, 
1c8e0 70 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  pFarg);.      }.
1c8f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c900 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c910 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65   ")");.      bre
1c920 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1c930 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1c940 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
1c950 54 4b 5f 45 58 49 53 54 53 3a 20 7b 0a 20 20 20  TK_EXISTS: {.   
1c960 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c970 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 45  nPrintf(pOut, "E
1c980 58 49 53 54 53 28 22 29 3b 0a 20 20 20 20 20 20  XISTS(");.      
1c990 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
1c9a0 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72  lect(pOut, pExpr
1c9b0 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
1c9c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c9d0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29  inPrintf(pOut,")
1c9e0 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1c9f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ca00 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
1ca10 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1ca20 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 28  nPrintf(pOut, "(
1ca30 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1ca40 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70  3ExplainSelect(p
1ca50 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Out, pExpr->x.pS
1ca60 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71  elect);.      sq
1ca70 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1ca80 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
1ca90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1caa0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
1cab0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1cac0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1cad0 4f 75 74 2c 20 22 49 4e 28 22 29 3b 0a 20 20 20  Out, "IN(");.   
1cae0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1caf0 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1cb00 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
1cb10 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1cb20 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29  rintf(pOut, ",")
1cb30 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
1cb40 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1cb50 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1cb60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1cb70 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
1cb80 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e  (pOut, pExpr->x.
1cb90 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
1cba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1cbb0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1cbc0 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45 78 70  rList(pOut, pExp
1cbd0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
1cbe0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1cbf0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1cc00 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20  pOut, ")");.    
1cc10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1cc20 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1cc30 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
1cc40 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1cc50 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
1cc60 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
1cc70 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
1cc80 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
1cc90 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
1cca0 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
1ccb0 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
1ccc0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
1ccd0 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
1cce0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
1ccf0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
1cd00 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
1cd10 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
1cd20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
1cd30 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
1cd40 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
1cd50 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20  .      Expr *pX 
1cd60 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1cd70 20 20 20 20 20 20 45 78 70 72 20 2a 70 59 20 3d        Expr *pY =
1cd80 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1cd90 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
1cda0 20 20 20 45 78 70 72 20 2a 70 5a 20 3d 20 70 45     Expr *pZ = pE
1cdb0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
1cdc0 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  1].pExpr;.      
1cdd0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1cde0 69 6e 74 66 28 70 4f 75 74 2c 20 22 42 45 54 57  intf(pOut, "BETW
1cdf0 45 45 4e 28 22 29 3b 0a 20 20 20 20 20 20 73 71  EEN(");.      sq
1ce00 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1ce10 28 70 4f 75 74 2c 20 70 58 29 3b 0a 20 20 20 20  (pOut, pX);.    
1ce20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1ce30 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22  Printf(pOut, ","
1ce40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ce50 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1ce60 2c 20 70 59 29 3b 0a 20 20 20 20 20 20 73 71 6c  , pY);.      sql
1ce70 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1ce80 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  f(pOut, ",");.  
1ce90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1cea0 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 5a 29  inExpr(pOut, pZ)
1ceb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1cec0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1ced0 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62  t, ")");.      b
1cee0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1cef0 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a  case TK_TRIGGER:
1cf00 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
1cf10 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f  he opcode is TK_
1cf20 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68  TRIGGER, then th
1cf30 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1cf40 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  a reference.    
1cf50 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e    ** to a column
1cf60 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72   in the new.* or
1cf70 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
1cf80 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74  bles available t
1cf90 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67  o.      ** trigg
1cfa0 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20  er programs. In 
1cfb0 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69  this case Expr.i
1cfc0 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
1cfd0 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20  1 for the.      
1cfe0 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  ** new.* pseudo-
1cff0 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20  table, or 0 for 
1d000 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
1d010 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f  -table. Expr.iCo
1d020 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  lumn.      ** is
1d030 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   set to the colu
1d040 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f  mn of the pseudo
1d050 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20  -table to read, 
1d060 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20  or to -1 to.    
1d070 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f    ** read the ro
1d080 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20  wid field..     
1d090 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1d0a0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1d0b0 4f 75 74 2c 20 22 25 73 28 25 64 29 22 2c 20 0a  Out, "%s(%d)", .
1d0c0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1d0d0 3e 69 54 61 62 6c 65 20 3f 20 22 4e 45 57 22 20  >iTable ? "NEW" 
1d0e0 3a 20 22 4f 4c 44 22 2c 20 70 45 78 70 72 2d 3e  : "OLD", pExpr->
1d0f0 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1d100 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1d110 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b   case TK_CASE: {
1d120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1d130 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1d140 2c 20 22 43 41 53 45 28 22 29 3b 0a 20 20 20 20  , "CASE(");.    
1d150 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1d160 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1d170 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
1d180 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1d190 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b  intf(pOut, ",");
1d1a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1d1b0 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f  plainExprList(pO
1d1c0 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ut, pExpr->x.pLi
1d1d0 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
1d1e0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1d1f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
1d200 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GER.    case TK_
1d210 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 63  RAISE: {.      c
1d220 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
1d230 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20   = "unk";.      
1d240 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 61  switch( pExpr->a
1d250 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
1d260 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62     case OE_Rollb
1d270 61 63 6b 3a 20 20 20 7a 54 79 70 65 20 3d 20 22  ack:   zType = "
1d280 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62 72 65 61  rollback";  brea
1d290 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1d2a0 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20 20 20 7a  OE_Abort:      z
1d2b0 54 79 70 65 20 3d 20 22 61 62 6f 72 74 22 3b 20  Type = "abort"; 
1d2c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d2d0 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a     case OE_Fail:
1d2e0 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
1d2f0 66 61 69 6c 22 3b 20 20 20 20 20 20 62 72 65 61  fail";      brea
1d300 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1d310 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 20 20 7a  OE_Ignore:     z
1d320 54 79 70 65 20 3d 20 22 69 67 6e 6f 72 65 22 3b  Type = "ignore";
1d330 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d340 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1d350 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1d360 75 74 2c 20 22 52 41 49 53 45 2d 25 73 28 25 73  ut, "RAISE-%s(%s
1d370 29 22 2c 20 7a 54 79 70 65 2c 20 70 45 78 70 72  )", zType, pExpr
1d380 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1d390 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d3a0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
1d3b0 20 7a 42 69 6e 4f 70 20 29 7b 0a 20 20 20 20 73   zBinOp ){.    s
1d3c0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1d3d0 6e 74 66 28 70 4f 75 74 2c 22 25 73 28 22 2c 20  ntf(pOut,"%s(", 
1d3e0 7a 42 69 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  zBinOp);.    sql
1d3f0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1d400 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pOut, pExpr->pLe
1d410 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
1d420 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1d430 75 74 2c 22 2c 22 29 3b 0a 20 20 20 20 73 71 6c  ut,",");.    sql
1d440 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1d450 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  pOut, pExpr->pRi
1d460 67 68 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ght);.    sqlite
1d470 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1d480 4f 75 74 2c 22 29 22 29 3b 0a 20 20 7d 65 6c 73  Out,")");.  }els
1d490 65 20 69 66 28 20 7a 55 6e 69 4f 70 20 29 7b 0a  e if( zUniOp ){.
1d4a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1d4b0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
1d4c0 73 28 22 2c 20 7a 55 6e 69 4f 70 29 3b 0a 20 20  s(", zUniOp);.  
1d4d0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1d4e0 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1d4f0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
1d500 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1d510 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20  tf(pOut,")");.  
1d520 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  }.}.#endif /* de
1d530 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1d540 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
1d550 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ) */..#if define
1d560 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1d570 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a  TREE_EXPLAIN)./*
1d580 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
1d590 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78  uman-readable ex
1d5a0 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20  planation of an 
1d5b0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
1d5c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d5d0 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
1d5e0 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78 70 72  Vdbe *pOut, Expr
1d5f0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1d600 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1d610 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  st==0 || pList->
1d620 6e 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  nExpr==0 ){.    
1d630 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1d640 69 6e 74 66 28 70 4f 75 74 2c 20 22 28 65 6d 70  intf(pOut, "(emp
1d650 74 79 2d 6c 69 73 74 29 22 29 3b 0a 20 20 20 20  ty-list)");.    
1d660 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
1d670 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
1d680 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
1d690 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1d6a0 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ut, pList->a[0].
1d6b0 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  pExpr);.  }else{
1d6c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1d6d0 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a 20  ainPush(pOut);. 
1d6e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
1d6f0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1d700 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1d710 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1d720 74 2c 20 22 69 74 65 6d 5b 25 64 5d 20 3d 20 22  t, "item[%d] = "
1d730 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , i);.      sqli
1d740 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70  te3ExplainPush(p
1d750 4f 75 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Out);.      sqli
1d760 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1d770 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Out, pList->a[i]
1d780 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  .pExpr);.      s
1d790 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70  qlite3ExplainPop
1d7a0 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66  (pOut);.      if
1d7b0 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
1d7c0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
1d7d0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1d7e0 6e 74 66 28 70 4f 75 74 2c 20 22 20 41 53 20 25  ntf(pOut, " AS %
1d7f0 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  s", pList->a[i].
1d800 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
1d810 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
1d820 3e 61 5b 69 5d 2e 62 53 70 61 6e 49 73 54 61 62  >a[i].bSpanIsTab
1d830 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1d840 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1d850 28 70 4f 75 74 2c 20 22 20 28 25 73 29 22 2c 20  (pOut, " (%s)", 
1d860 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  pList->a[i].zSpa
1d870 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
1d880 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e    if( i<pList->n
1d890 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20  Expr-1 ){.      
1d8a0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1d8b0 4e 4c 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20  NL(pOut);.      
1d8c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1d8d0 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 4f  te3ExplainPop(pO
1d8e0 75 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ut);.  }.}.#endi
1d8f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1d900 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  G */../*.** Gene
1d910 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
1d920 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
1d930 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
1d940 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
1d950 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1d960 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
1d970 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
1d980 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
1d990 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
1d9a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
1d9b0 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
1d9c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
1d9d0 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67  TE_ECEL_DUP flag
1d9e0 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61 72   prevents the ar
1d9f0 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69  guments from bei
1da00 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69  ng.** filled usi
1da10 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50  ng OP_SCopy.  OP
1da20 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73  _Copy must be us
1da30 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
1da40 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
1da50 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e  L_FACTOR argumen
1da60 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e  t allows constan
1da70 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62  t arguments to b
1da80 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75  e.** factored ou
1da90 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a  t into initializ
1daa0 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 69  ation code..*/.i
1dab0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1dac0 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  deExprList(.  Pa
1dad0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1dae0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1daf0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1db00 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54  t *pList,   /* T
1db10 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
1db20 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  st to be coded *
1db30 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20  /.  int target, 
1db40 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
1db50 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
1db60 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20   */.  u8 flags  
1db70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
1db80 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20  TE_ECEL_* flags 
1db90 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
1dba0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1dbb0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  tem;.  int i, n;
1dbc0 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28  .  u8 copyOp = (
1dbd0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
1dbe0 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f  CEL_DUP) ? OP_Co
1dbf0 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20  py : OP_SCopy;. 
1dc00 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
1dc10 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  0 );.  assert( t
1dc20 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
1dc30 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
1dc40 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76  be!=0 );  /* Nev
1dc50 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72  er gets this far
1dc60 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
1dc70 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
1dc80 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61  ;.  if( !ConstFa
1dc90 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
1dca0 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
1dcb0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20  E_ECEL_FACTOR;. 
1dcc0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1dcd0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69  ->a, i=0; i<n; i
1dce0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1dcf0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1dd00 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
1dd10 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53    if( (flags & S
1dd20 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
1dd30 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  R)!=0 && sqlite3
1dd40 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
1dd50 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
1dd60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
1dd70 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
1dd80 70 72 2c 20 74 61 72 67 65 74 2b 69 2c 20 30 29  pr, target+i, 0)
1dd90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1dda0 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73     int inReg = s
1ddb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1ddc0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1ddd0 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
1dde0 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
1ddf0 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
1de00 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
1de10 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
1de20 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1de30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
1de40 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  pyOp==OP_Copy.  
1de50 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73         && (pOp=s
1de60 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
1de70 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d  v, -1))->opcode=
1de80 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
1de90 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70    && pOp->p1+pOp
1dea0 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20  ->p3+1==inReg.  
1deb0 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
1dec0 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72  2+pOp->p3+1==tar
1ded0 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b  get+i.        ){
1dee0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
1def0 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  p3++;.        }e
1df00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1df10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1df20 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65  (v, copyOp, inRe
1df30 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
1df40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1df50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1df60 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
1df70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1df80 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   a BETWEEN opera
1df90 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20  tor..**.**    x 
1dfa0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
1dfb0 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
1dfc0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1dfd0 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20   .**.**    x>=y 
1dfe0 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43  AND x<=z.**.** C
1dff0 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
1e000 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
1e010 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
1e020 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c  expression.** el
1e030 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e  ementation of x.
1e040 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e050 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
1e060 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1e070 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
1e080 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1e090 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1e0a0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
1e0b0 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45     /* The BETWEE
1e0c0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
1e0d0 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
1e0e0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1e0f0 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20   if the jump is 
1e100 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a  taken */.  int j
1e110 75 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20  umpIfTrue,   /* 
1e120 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
1e130 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
1e140 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  true */.  int ju
1e150 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54  mpIfNull    /* T
1e160 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1e170 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e  the BETWEEN is N
1e180 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ULL */.){.  Expr
1e190 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a   exprAnd;     /*
1e1a0 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   The AND operato
1e1b0 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78  r in  x>=y AND x
1e1c0 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63  <=z  */.  Expr c
1e1d0 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54  ompLeft;    /* T
1e1e0 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a  he  x>=y  term *
1e1f0 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67  /.  Expr compRig
1e200 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c  ht;   /* The  x<
1e210 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =z  term */.  Ex
1e220 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20  pr exprX;       
1e230 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78  /* The  x  subex
1e240 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
1e250 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
1e260 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
1e270 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20   register */..  
1e280 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1e290 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e2a0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1e2b0 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70  .  exprX = *pExp
1e2c0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  r->pLeft;.  expr
1e2d0 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
1e2e0 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74  .  exprAnd.pLeft
1e2f0 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20   = &compLeft;.  
1e300 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d  exprAnd.pRight =
1e310 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63   &compRight;.  c
1e320 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
1e330 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  GE;.  compLeft.p
1e340 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
1e350 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74   compLeft.pRight
1e360 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1e370 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1e380 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20   compRight.op = 
1e390 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67  TK_LE;.  compRig
1e3a0 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ht.pLeft = &expr
1e3b0 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  X;.  compRight.p
1e3c0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
1e3d0 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
1e3e0 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69  pr;.  exprToRegi
1e3f0 73 74 65 72 28 26 65 78 70 72 58 2c 20 73 71 6c  ster(&exprX, sql
1e400 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e410 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c  (pParse, &exprX,
1e420 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20   &regFree1));.  
1e430 69 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29  if( jumpIfTrue )
1e440 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1e450 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1e460 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
1e470 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
1e480 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1e490 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1e4a0 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
1e4b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1e4c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  ;.  }.  sqlite3R
1e4d0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1e4e0 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
1e4f0 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64  ..  /* Ensure ad
1e500 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65  equate test cove
1e510 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61  rage */.  testca
1e520 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1e530 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1e540 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
1e550 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1e560 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1e570 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
1e580 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
1e590 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1e5a0 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1e5b0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1e5c0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e5d0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e5e0 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1e5f0 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
1e600 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1e610 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1e620 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1e630 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1e640 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1e650 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1e660 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1e670 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
1e680 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1e690 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1e6a0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1e6b0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1e6c0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1e6d0 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1e6e0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1e6f0 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1e700 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1e710 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
1e720 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
1e730 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
1e740 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
1e750 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
1e760 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1e770 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
1e780 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
1e790 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
1e7a0 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
1e7b0 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
1e7c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
1e7d0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
1e7e0 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
1e7f0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
1e800 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
1e810 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
1e820 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
1e830 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
1e840 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
1e850 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
1e860 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
1e870 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
1e880 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
1e890 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
1e8a0 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
1e8b0 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
1e8c0 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
1e8d0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1e8e0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
1e8f0 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
1e900 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
1e910 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
1e920 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
1e930 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
1e940 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
1e950 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
1e960 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
1e970 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
1e980 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
1e990 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
1e9a0 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
1e9b0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1e9c0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1e9d0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1e9e0 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
1e9f0 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
1ea00 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1ea10 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
1ea20 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
1ea30 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1ea40 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
1ea50 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
1ea60 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
1ea70 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1ea80 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
1ea90 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
1eaa0 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74  (v==0) )     ret
1eab0 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e  urn;  /* Existen
1eac0 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
1ead0 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
1eae0 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70    if( NEVER(pExp
1eaf0 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  r==0) ) return; 
1eb00 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20   /* No way this 
1eb10 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  can happen */.  
1eb20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
1eb30 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1eb40 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1eb50 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
1eb60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1eb70 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1eb80 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1eb90 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1eba0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1ebb0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1ebc0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75  pr->pLeft, d2,ju
1ebd0 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
1ebe0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1ebf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1ec00 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1ec10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ec20 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1ec30 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1ec40 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1ec50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ec60 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1ec70 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
1ec80 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1ec90 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
1eca0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ecb0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
1ecc0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ecd0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1ece0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1ecf0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1ed00 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1ed10 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1ed20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ed30 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1ed40 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1ed50 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1ed60 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1ed70 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1ed80 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1ed90 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1eda0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
1edb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1edc0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
1edd0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1ede0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1edf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ee00 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1ee10 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ee20 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1ee30 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1ee40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ee50 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1ee60 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1ee70 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1ee80 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1ee90 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1eea0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1eeb0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1eec0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1eed0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1eee0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1eef0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1ef00 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1ef10 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1ef20 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1ef30 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1ef40 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1ef50 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1ef60 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ef70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1ef80 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1ef90 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1efa0 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
1efb0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
1efc0 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
1efd0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1efe0 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
1eff0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1f000 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
1f010 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
1f020 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f030 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
1f040 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
1f050 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1f060 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
1f070 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
1f080 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f090 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
1f0a0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f0b0 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
1f0c0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
1f0d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f0e0 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
1f0f0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
1f100 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
1f110 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
1f120 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f130 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1f140 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
1f150 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
1f160 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
1f170 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1f180 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
1f190 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f1a0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1f1b0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f1c0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1f1d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f1e0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1f1f0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
1f200 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f210 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1f220 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f230 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
1f240 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f250 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f260 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f270 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f280 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1f290 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f2a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1f2b0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1f2c0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
1f2d0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
1f2e0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f   TK_NE;.      co
1f2f0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1f300 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f310 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1f320 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1f330 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1f340 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  t, SQLITE_NULLEQ
1f350 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1f360 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1f370 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  K_EQ);.      Vdb
1f380 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1f390 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20  p==TK_NE);.     
1f3a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f3b0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1f3c0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f3d0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1f3e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f3f0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
1f400 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1f410 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
1f420 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
1f430 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
1f440 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f450 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1f460 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
1f470 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
1f480 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
1f490 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
1f4a0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f4b0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f4c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f4d0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1f4e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f4f0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
1f500 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56  , dest);.      V
1f510 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f520 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
1f530 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1f540 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1f550 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
1f560 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f570 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
1f580 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f590 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
1f5a0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1f5b0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1f5c0 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
1f5d0 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
1f5e0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 31  , pExpr, dest, 1
1f5f0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1f600 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f610 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1f620 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1f630 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
1f640 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
1f650 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
1f660 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1f670 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
1f680 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e  IfNull = jumpIfN
1f690 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73  ull ? dest : des
1f6a0 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20  tIfFalse;.      
1f6b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1f6c0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
1f6d0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
1f6e0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
1f6f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f700 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1f710 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
1f720 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1f730 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
1f740 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72  False);.      br
1f750 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1f760 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
1f770 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41  .      if( exprA
1f780 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
1f790 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f7a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f7b0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
1f7c0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
1f7d0 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
1f7e0 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
1f7f0 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a        /* No-op *
1f800 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
1f810 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
1f820 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f830 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
1f840 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f860 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp3(v, OP_If, r
1f870 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
1f880 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ull!=0);.       
1f890 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1f8a0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1f8b0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f8c0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f8d0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1f8e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
1f8f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f900 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1f910 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1f920 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1f930 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1f940 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1f950 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a  regFree2);  .}..
1f960 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1f970 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
1f980 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
1f990 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
1f9a0 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
1f9b0 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
1f9c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1f9d0 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63  s false but exec
1f9e0 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
1f9f0 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
1fa00 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1fa10 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  on is true..**.*
1fa20 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
1fa30 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
1fa40 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
1fa50 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74  rue nor false) t
1fa60 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a  hen.** jump if j
1fa70 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c  umpIfNull is SQL
1fa80 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f  ITE_JUMPIFNULL o
1fa90 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  r fall through i
1faa0 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20  f jumpIfNull.** 
1fab0 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  is 0..*/.void sq
1fac0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1fad0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1fae0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1faf0 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
1fb00 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
1fb10 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1fb20 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
1fb30 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1fb40 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1fb50 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
1fb60 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
1fb70 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
1fb80 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
1fb90 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
1fba0 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
1fbb0 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  v==0) ) return; 
1fbc0 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
1fbd0 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
1fbe0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
1fbf0 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65  pExpr==0 )    re
1fc00 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  turn;..  /* The 
1fc10 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e  value of pExpr->
1fc20 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65  op and op are re
1fc30 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
1fc40 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1fc50 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
1fc60 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20         op.  **  
1fc70 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20       ---------  
1fc80 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
1fc90 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  --.  **       TK
1fca0 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  _ISNULL         
1fcb0 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a   OP_NotNull.  **
1fcc0 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c         TK_NOTNUL
1fcd0 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e  L         OP_IsN
1fce0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
1fcf0 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20  K_NE            
1fd00 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20    OP_Eq.  **    
1fd10 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20     TK_EQ        
1fd20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a        OP_Ne.  **
1fd30 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20         TK_GT    
1fd40 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a            OP_Le.
1fd50 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45    **       TK_LE
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1fd70 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Gt.  **       T
1fd80 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20  K_GE            
1fd90 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20    OP_Lt.  **    
1fda0 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20     TK_LT        
1fdb0 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a        OP_Ge.  **
1fdc0 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20  .  ** For other 
1fdd0 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d  values of pExpr-
1fde0 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66  >op, op is undef
1fdf0 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e  ined and unused.
1fe00 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
1fe10 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
1fe20 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72  onstants are arr
1fe30 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20  anged such that 
1fe40 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70  we.  ** can comp
1fe50 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ute the mapping 
1fe60 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20  above using the 
1fe70 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73  following expres
1fe80 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72  sion..  ** Asser
1fe90 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74  t()s verify that
1fea0 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
1feb0 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
1fec0 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72  /.  op = ((pExpr
1fed0 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26  ->op+(TK_ISNULL&
1fee0 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c  1))^1)-(TK_ISNUL
1fef0 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  L&1);..  /* Veri
1ff00 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e  fy correct align
1ff10 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20  ment of TK_ and 
1ff20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20  OP_ constants.  
1ff30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
1ff40 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  pr->op!=TK_ISNUL
1ff50 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e  L || op==OP_NotN
1ff60 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
1ff70 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
1ff80 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  OTNULL || op==OP
1ff90 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  _IsNull );.  ass
1ffa0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1ffb0 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_NE || op==OP_
1ffc0 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Eq );.  assert( 
1ffd0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
1ffe0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b   || op==OP_Ne );
1fff0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
20000 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f  ->op!=TK_LT || o
20010 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73  p==OP_Ge );.  as
20020 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
20030 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LE || op==OP
20040 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Gt );.  assert(
20050 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
20060 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  T || op==OP_Le )
20070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
20080 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  r->op!=TK_GE || 
20090 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20  op==OP_Lt );..  
200a0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
200b0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
200c0 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65  _AND: {.      te
200d0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
200e0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
200f0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
20100 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
20110 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
20120 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
20130 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
20140 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
20150 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20160 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
20170 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
20180 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
20190 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
201a0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
201b0 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
201c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
201d0 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
201e0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
201f0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20200 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20210 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
20220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20230 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
20240 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
20250 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e   d2, jumpIfNull^
20260 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
20270 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
20280 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
20290 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
202a0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
202b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
202c0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
202d0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
202e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
202f0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
20300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20310 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
20320 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
20330 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20340 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
20350 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
20360 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
20370 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
20380 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
20390 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
203a0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
203b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
203c0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
203d0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
203e0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
203f0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
20400 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
20410 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
20420 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20430 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
20440 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
20450 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
20460 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
20470 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
20480 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
20490 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
204a0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
204b0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
204c0 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
204d0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
204e0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
204f0 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20510 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
20520 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
20530 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
20540 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
20550 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
20560 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
20570 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
20580 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
20590 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
205a0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
205b0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
205c0 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
205d0 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
205e0 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
205f0 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
20600 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
20610 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
20620 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
20630 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
20640 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
20650 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
20660 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
20670 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
20680 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
20690 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Eq); VdbeCovera
206a0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71  geIf(v,op==OP_Eq
206b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
206c0 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
206d0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
206e0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
206f0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
20700 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20710 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
20720 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20730 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
20740 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20750 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
20760 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
20770 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
20780 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
20790 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
207a0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
207b0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
207c0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
207d0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
207e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
207f0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
20800 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
20810 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
20820 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
20830 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
20840 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  e2);.      op = 
20850 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
20860 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f  S) ? TK_NE : TK_
20870 45 51 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  EQ;.      codeCo
20880 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
20890 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
208a0 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208c0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53   r1, r2, dest, S
208d0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
208e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
208f0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51  eIf(v, op==TK_EQ
20900 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
20910 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
20920 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73  K_NE);.      tes
20930 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
20940 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
20950 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
20960 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
20970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20980 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
20990 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
209a0 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
209b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
209c0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
209d0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
209e0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
209f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
20a00 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
20a10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
20a20 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20  ==TK_ISNULL );  
20a30 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
20a40 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
20a50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
20a60 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
20a70 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  L );  VdbeCovera
20a80 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
20a90 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
20aa0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20ab0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
20ac0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20ad0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
20ae0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
20af0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
20b00 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
20b10 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
20b20 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c   pExpr, dest, 0,
20b30 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
20b40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20b50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20b60 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
20b70 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
20b80 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66        if( jumpIf
20b90 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
20ba0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
20bb0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
20bc0 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20   dest, dest);.  
20bd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20be0 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
20bf0 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
20c00 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
20c10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20c20 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
20c30 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
20c40 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
20c50 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
20c60 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
20c70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
20c80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20c90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
20ca0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
20cb0 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
20cc0 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
20cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20ce0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
20cf0 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  to, 0, dest);.  
20d00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78      }else if( ex
20d10 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
20d20 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
20d30 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
20d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20d50 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
20d60 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
20d70 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
20d80 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
20d90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
20da0 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64   OP_IfNot, r1, d
20db0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
20dc0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
20dd0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
20de0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20df0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
20e00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20e10 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
20e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20e30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
20e40 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
20e50 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
20e60 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
20e70 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
20e80 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
20e90 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ree2);.}../*.** 
20ea0 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72  Do a deep compar
20eb0 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72  ison of two expr
20ec0 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52  ession trees.  R
20ed0 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
20ee0 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  wo.** expression
20ef0 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79  s are completely
20f00 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74   identical.  Ret
20f10 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64 69  urn 1 if they di
20f20 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20  ffer only.** by 
20f30 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  a COLLATE operat
20f40 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65  or at the top le
20f50 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69  vel.  Return 2 i
20f60 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
20f70 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72  erences.** other
20f80 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65   than the top-le
20f90 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  vel COLLATE oper
20fa0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
20fb0 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66  ny subelement of
20fc0 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61   pB has Expr.iTa
20fd0 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69  ble==(-1) then i
20fe0 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  t is allowed.** 
20ff0 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  to compare equal
21000 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   to an equivalen
21010 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20  t element in pA 
21020 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65  with Expr.iTable
21030 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  ==iTab..**.** Th
21040 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20  e pA side might 
21050 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  be using TK_REGI
21060 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20 69  STER.  If that i
21070 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 70  s the case and p
21080 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e  B is.** not usin
21090 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75  g TK_REGISTER bu
210a0 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 65  t is otherwise e
210b0 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20  quivalent, then 
210c0 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a  still return 0..
210d0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
210e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
210f0 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20  l return 2 even 
21100 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
21110 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79  ssions.** really
21120 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   are equivalent.
21130 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70    If we cannot p
21140 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78  rove that the ex
21150 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
21160 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72   identical, we r
21170 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20  eturn 2 just to 
21180 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
21190 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
211a0 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20  returns 2, then 
211b0 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c  you do not reall
211c0 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61  y know for certa
211d0 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a  in if the two.**
211e0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
211f0 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
21200 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f  if you get a 0 o
21210 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e  r 1 return, then
21220 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73   you.** can be s
21230 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ure the expressi
21240 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
21250 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73  .  In the places
21260 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72   where.** this r
21270 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20  outine is used, 
21280 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74  it does not hurt
21290 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61   to get an extra
212a0 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73   2 - that.** jus
212b0 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
212c0 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20  n some slightly 
212d0 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75  slower code.  Bu
212e0 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  t returning.** a
212f0 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72  n incorrect 0 or
21300 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f   1 could lead to
21310 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a   a malfunction..
21320 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
21330 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
21340 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e  pA, Expr *pB, in
21350 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63  t iTab){.  u32 c
21360 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20  ombinedFlags;.  
21370 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
21380 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
21390 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b   pB==pA ? 0 : 2;
213a0 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46  .  }.  combinedF
213b0 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73  lags = pA->flags
213c0 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20   | pB->flags;.  
213d0 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
213e0 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
213f0 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e  ){.    if( (pA->
21400 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26  flags&pB->flags&
21410 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20  EP_IntValue)!=0 
21420 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d  && pA->u.iValue=
21430 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b  =pB->u.iValue ){
21440 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
21450 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
21460 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 2;.  }.  if( p
21470 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b  A->op!=pB->op ){
21480 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
21490 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73  =TK_COLLATE && s
214a0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
214b0 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c  e(pA->pLeft, pB,
214c0 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20   iTab)<2 ){.    
214d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
214e0 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70  }.    if( pB->op
214f0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
21500 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
21510 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74  re(pA, pB->pLeft
21520 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20  , iTab)<2 ){.   
21530 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
21540 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
21550 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
21560 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
21570 41 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54  ALWAYS(pA->op!=T
21580 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26  K_AGG_COLUMN) &&
21590 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
215a0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
215b0 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
215c0 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  >u.zToken)!=0 ){
215d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
215e0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
215f0 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a   ? 1 : 2;.    }.
21600 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66    }.  if( (pA->f
21610 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
21620 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
21630 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
21640 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
21650 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65   ALWAYS((combine
21660 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65  dFlags & EP_Toke
21670 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20  nOnly)==0) ){.  
21680 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c    if( combinedFl
21690 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
216a0 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  ct ) return 2;. 
216b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
216c0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
216d0 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20  eft, pB->pLeft, 
216e0 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
216f0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
21700 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
21710 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69  >pRight, pB->pRi
21720 67 68 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ght, iTab) ) ret
21730 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
21740 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
21750 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73  mpare(pA->x.pLis
21760 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20  t, pB->x.pList, 
21770 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
21780 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  ;.    if( ALWAYS
21790 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ((combinedFlags 
217a0 26 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30  & EP_Reduced)==0
217b0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
217c0 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
217d0 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
217e0 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   2;.      if( pA
217f0 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
21800 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20  able .       && 
21810 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  (pA->iTable!=iTa
21820 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69  b || NEVER(pB->i
21830 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74  Table>=0)) ) ret
21840 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
21850 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21860 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
21870 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
21880 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ts.  Return 0 if
21890 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
218a0 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d  cal and .** non-
218b0 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66  zero if they dif
218c0 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
218d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
218e0 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
218f0 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
21900 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
21910 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
21920 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
21930 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
21940 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
21950 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
21960 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21970 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72  tine might retur
21980 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65  n non-zero for e
21990 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69  quivalent ExprLi
219a0 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c  sts.  The.** onl
219b0 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69  y consequence wi
219c0 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f  ll be disabled o
219d0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42  ptimizations.  B
219e0 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ut this routine.
219f0 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65  ** must never re
21a00 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
21a10 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
21a20 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
21a30 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e  , or.** a malfun
21a40 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ction will resul
21a50 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  t..**.** Two NUL
21a60 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63  L pointers are c
21a70 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
21a80 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61  the same.  But a
21a90 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a   NULL pointer.**
21aa0 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20   always differs 
21ab0 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  from a non-NULL 
21ac0 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
21ad0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
21ae0 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20  ompare(ExprList 
21af0 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *pA, ExprList *p
21b00 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
21b10 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
21b20 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65  =0 && pB==0 ) re
21b30 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
21b40 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72  ==0 || pB==0 ) r
21b50 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
21b60 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45  A->nExpr!=pB->nE
21b70 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  xpr ) return 1;.
21b80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
21b90 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
21ba0 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d    Expr *pExprA =
21bb0 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pA->a[i].pExpr;
21bc0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
21bd0 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78  B = pB->a[i].pEx
21be0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e  pr;.    if( pA->
21bf0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d  a[i].sortOrder!=
21c00 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pB->a[i].sortOrd
21c10 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  er ) return 1;. 
21c20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
21c30 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41  prCompare(pExprA
21c40 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20  , pExprB, iTab) 
21c50 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
21c60 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
21c70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
21c80 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65   if we can prove
21c90 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c   the pE2 will al
21ca0 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20  ways be true if 
21cb0 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20  pE1 is.** true. 
21cc0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
21cd0 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c   we cannot compl
21ce0 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72  ete the proof or
21cf0 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a   if pE2 might.**
21d00 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d   be false.  Exam
21d10 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
21d20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE1: x==5       
21d30 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
21d40 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72        Result: tr
21d50 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
21d60 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78  >0        pE2: x
21d70 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
21d80 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Result: false.**
21d90 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20       pE1: x=21  
21da0 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f       pE2: x=21 O
21db0 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c  R y=43     Resul
21dc0 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
21dd0 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70  E1: x!=123     p
21de0 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
21df0 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
21e00 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
21e10 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20  =?1      pE2: x 
21e20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
21e30 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
21e40 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c     pE1: x IS NUL
21e50 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54  L  pE2: x IS NOT
21e60 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
21e70 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
21e80 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45  1: x IS ?2    pE
21e90 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
21ea0 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73      Reuslt: fals
21eb0 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d  e.**.** When com
21ec0 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e  paring TK_COLUMN
21ed0 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70   nodes between p
21ee0 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70  E1 and pE2, if p
21ef0 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69  E2 has.** Expr.i
21f00 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73  Table<0 then ass
21f10 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62  ume a table numb
21f20 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62  er given by iTab
21f30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20  ..**.** When in 
21f40 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61  doubt, return fa
21f50 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  lse.  Returning 
21f60 74 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20  true might give 
21f70 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  a performance.**
21f80 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52   improvement.  R
21f90 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d  eturning false m
21fa0 69 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72  ight cause a per
21fb0 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
21fc0 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69  on, but.** it wi
21fd0 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74  ll always give t
21fe0 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
21ff0 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61  r and is hence a
22000 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69  lways safe..*/.i
22010 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  nt sqlite3ExprIm
22020 70 6c 69 65 73 45 78 70 72 28 45 78 70 72 20 2a  pliesExpr(Expr *
22030 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20  pE1, Expr *pE2, 
22040 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28  int iTab){.  if(
22050 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
22060 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54  are(pE1, pE2, iT
22070 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ab)==0 ){.    re
22080 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
22090 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  ( pE2->op==TK_OR
220a0 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45  .   && (sqlite3E
220b0 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
220c0 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20  E1, pE2->pLeft, 
220d0 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20 20  iTab).          
220e0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70     || sqlite3Exp
220f0 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31  rImpliesExpr(pE1
22100 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69  , pE2->pRight, i
22110 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20  Tab) ).  ){.    
22120 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
22130 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
22140 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71  NOTNULL.   && sq
22150 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
22160 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32  (pE1->pLeft, pE2
22170 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d  ->pLeft, iTab)==
22180 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f 70  0.   && (pE1->op
22190 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70  !=TK_ISNULL && p
221a0 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20  E1->op!=TK_IS). 
221b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
221c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
221d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  ;.}../*.** An in
221e0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
221f0 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
22200 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
22210 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
22220 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e  to count referen
22230 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c  ces to table col
22240 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75  umns in the argu
22250 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20  ments of an .** 
22260 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
22270 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  on, in order to 
22280 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  implement the.**
22290 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
222a0 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e  ThisSrc() routin
222b0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63  e..*/.struct Src
222c0 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73  Count {.  SrcLis
222d0 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e  t *pSrc;   /* On
222e0 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f  e particular FRO
222f0 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65  M clause in a ne
22300 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  sted query */.  
22310 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20  int nThis;      
22320 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
22330 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
22340 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  mns in pSrcList 
22350 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b  */.  int nOther;
22360 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22370 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
22380 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65   columns in othe
22390 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a  r FROM clauses *
223a0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  /.};../*.** Coun
223b0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
223c0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
223d0 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
223e0 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e   int exprSrcCoun
223f0 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
22400 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
22410 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28  .  /* The NEVER(
22420 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  ) on the second 
22430 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20  term is because 
22440 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
22450 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a  sesThisSrc().  *
22460 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c  * is always call
22470 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  ed before sqlite
22480 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
22490 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20  egates() and so 
224a0 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55  the.  ** TK_COLU
224b0 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74  MNs have not yet
224c0 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
224d0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
224e0 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c  MN.  If.  ** sql
224f0 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
22500 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65  ThisSrc() is use
22510 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e  d differently in
22520 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65   the future, the
22530 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69  .  ** NEVER() wi
22540 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ll need to be re
22550 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  moved. */.  if( 
22560 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
22570 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45  LUMN || NEVER(pE
22580 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
22590 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69  COLUMN) ){.    i
225a0 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
225b0 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70   SrcCount *p = p
225c0 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f  Walker->u.pSrcCo
225d0 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74  unt;.    SrcList
225e0 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
225f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
22600 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
22610 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ){.      if( pEx
22620 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  pr->iTable==pSrc
22630 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[i].iCursor )
22640 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22650 20 20 69 66 28 20 69 3c 70 53 72 63 2d 3e 6e 53    if( i<pSrc->nS
22660 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  rc ){.      p->n
22670 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  This++;.    }els
22680 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68  e{.      p->nOth
22690 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  er++;.    }.  }.
226a0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
226b0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
226c0 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79  Determine if any
226d0 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
226e0 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46  s to the pExpr F
226f0 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63  unction referenc
22700 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20  e.** pSrcList.  
22710 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
22720 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65  hey do.  Also re
22730 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
22740 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
22750 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72   no arguments or
22760 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61   has only consta
22770 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
22780 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70  eturn false if p
22790 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63  Expr.** referenc
227a0 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e  es columns but n
227b0 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61  ot columns of ta
227c0 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53  bles found in pS
227d0 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73  rcList..*/.int s
227e0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
227f0 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a  esThisSrc(Expr *
22800 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a  pExpr, SrcList *
22810 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c  pSrcList){.  Wal
22820 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20  ker w;.  struct 
22830 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20  SrcCount cnt;.  
22840 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
22850 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
22860 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ON );.  memset(&
22870 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
22880 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
22890 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75  ack = exprSrcCou
228a0 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f  nt;.  w.u.pSrcCo
228b0 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e  unt = &cnt;.  cn
228c0 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73  t.pSrc = pSrcLis
228d0 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d  t;.  cnt.nThis =
228e0 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72   0;.  cnt.nOther
228f0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57   = 0;.  sqlite3W
22900 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20  alkExprList(&w, 
22910 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
22920 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54  .  return cnt.nT
22930 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74  his>0 || cnt.nOt
22940 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  her==0;.}../*.**
22950 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
22960 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
22970 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79  fo->aCol[] array
22980 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
22990 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
229a0 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
229b0 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
229c0 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
229d0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
229e0 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  int addAggInfoCo
229f0 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  lumn(sqlite3 *db
22a00 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
22a10 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
22a20 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  nfo->aCol = sqli
22a30 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
22a40 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20  (.       db,.   
22a50 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c      pInfo->aCol,
22a60 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
22a70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a  Info->aCol[0]),.
22a80 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
22a90 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26  Column,.       &
22aa0 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
22ab0 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
22ac0 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
22ad0 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
22ae0 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79  o->aFunc[] array
22af0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
22b00 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
22b10 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
22b20 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
22b30 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
22b40 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
22b50 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75  int addAggInfoFu
22b60 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nc(sqlite3 *db, 
22b70 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
22b80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
22b90 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74  o->aFunc = sqlit
22ba0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
22bb0 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20  .       db, .   
22bc0 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63      pInfo->aFunc
22bd0 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
22be0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29  pInfo->aFunc[0])
22bf0 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
22c00 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26  >nFunc,.       &
22c10 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
22c20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
22c30 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70  This is the xExp
22c40 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20  rCallback for a 
22c50 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74  tree walker.  It
22c60 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69   is used to.** i
22c70 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
22c80 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
22c90 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71  gates().  See sq
22ca0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
22cb0 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f  Aggregates.** fo
22cc0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
22cd0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
22ce0 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
22cf0 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20  ggregate(Walker 
22d00 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
22d10 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
22d20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
22d30 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
22d40 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70  .pNC;.  Parse *p
22d50 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
22d60 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse;.  SrcList *
22d70 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
22d80 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49  pSrcList;.  AggI
22d90 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
22da0 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a  pNC->pAggInfo;..
22db0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
22dc0 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
22dd0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
22de0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
22df0 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
22e00 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
22e10 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
22e20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22e30 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
22e40 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f  OLUMN );.      /
22e50 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
22e60 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
22e70 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  in one of the ta
22e80 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
22e90 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
22ea0 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
22eb0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
22ec0 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
22ed0 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
22ee0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
22ef0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
22f00 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20   pSrcList->a;.  
22f10 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
22f20 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
22f30 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
22f40 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
22f50 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
22f60 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ol;.          as
22f70 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
22f80 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
22f90 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
22fa0 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
22fb0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
22fc0 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
22fd0 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
22fe0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65       /* If we re
22ff0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
23000 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45  it means that pE
23010 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20  xpr refers to a 
23020 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
23030 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20    ** that is in 
23040 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
23050 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
23060 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20   query.  .      
23070 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
23080 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20       ** Make an 
23090 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f  entry for the co
230a0 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f  lumn in pAggInfo
230b0 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72  ->aCol[] if ther
230c0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
230d0 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79   is not an entry
230e0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
230f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
23100 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
23110 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
23120 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ol = pAggInfo->a
23130 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
23140 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67   for(k=0; k<pAgg
23150 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  Info->nColumn; k
23160 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
23170 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
23180 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78  Col->iTable==pEx
23190 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  pCol->iColumn==p
231c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
231d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
231e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
231f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23200 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23210 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e    if( (k>=pAggIn
23220 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20  fo->nColumn).   
23230 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20            && (k 
23240 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  = addAggInfoColu
23250 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  mn(pParse->db, p
23260 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20  AggInfo))>=0 .  
23270 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
23280 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
23290 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
232a0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[k];.          
232b0 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d      pCol->pTab =
232c0 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
232d0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
232e0 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
232f0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
23300 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
23310 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
23320 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
23330 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d        pCol->iMem
23340 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
23350 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
23360 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
23370 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
23380 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
23390 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
233a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
233b0 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
233c0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
233d0 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a        int j, n;.
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233f0 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20  ExprList *pGB = 
23400 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
23410 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  By;.            
23420 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
23430 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20  ist_item *pTerm 
23440 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20  = pGB->a;.      
23450 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47            n = pG
23460 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  B->nExpr;.      
23470 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
23480 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65  0; j<n; j++, pTe
23490 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
234a0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
234b0 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
234c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
234d0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
234e0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d  TK_COLUMN && pE-
234f0 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
23500 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
23510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23520 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pE->iColumn==pEx
23530 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
23540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23550 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
23560 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23580 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
23590 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
235a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
235b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
235c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
235d0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
235e0 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
235f0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
23600 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41  orterColumn = pA
23610 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67  ggInfo->nSorting
23620 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
23630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23650 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
23660 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  now an entry for
23670 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e   pExpr in pAggIn
23680 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68  fo->aCol[] (eith
23690 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
236a0 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  * because it was
236b0 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72   there before or
236c0 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
236d0 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20   created it)..  
236e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e            ** Con
236f0 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74  vert the pExpr t
23700 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f  o be a TK_AGG_CO
23710 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74  LUMN referring t
23720 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  o that.         
23730 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e     ** pAggInfo->
23740 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20  aCol[] entry..  
23750 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
23760 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
23770 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
23780 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
23790 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
237a0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
237b0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
237c0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
237d0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a   TK_AGG_COLUMN;.
237e0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
237f0 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b  r->iAgg = (i16)k
23800 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
23810 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
23820 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d   /* endif pExpr-
23830 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
23840 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20  iCursor */.     
23850 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70     } /* end loop
23860 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a   over pSrcList *
23870 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
23880 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
23890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
238a0 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
238b0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  : {.      if( (p
238c0 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
238d0 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20  _InAggFunc)==0. 
238e0 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72        && pWalker
238f0 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70  ->walkerDepth==p
23900 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20  Expr->op2.      
23910 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
23920 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
23930 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
23940 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
23950 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
23960 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
23970 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
23980 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
23990 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
239a0 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
239b0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
239c0 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
239d0 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
239e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
239f0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
23a00 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
23a10 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
23a20 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
23a30 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
23a40 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
23a50 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
23a60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23a70 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
23a80 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
23a90 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
23aa0 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
23ab0 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
23ac0 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
23ad0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
23ae0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23af0 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
23b00 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
23b10 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
23b20 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
23b30 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
23b40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23b50 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
23b60 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
23b70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
23b80 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
23b90 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
23ba0 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
23bb0 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
23bc0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
23bd0 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
23be0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
23bf0 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
23c00 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
23c10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
23c20 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
23c30 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
23c40 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
23c50 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
23c60 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
23c70 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
23c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23c90 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
23ca0 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ken, sqlite3Strl
23cb0 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
23cc0 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  oken),.         
23cd0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
23ce0 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  >x.pList ? pExpr
23cf0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
23d00 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20   : 0, enc, 0);. 
23d10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
23d20 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
23d30 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
23d40 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
23d50 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50  ->iDistinct = pP
23d60 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
23d70 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
23d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
23d90 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
23da0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
23db0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
23dc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23dd0 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20    /* Make pExpr 
23de0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70  point to the app
23df0 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66  ropriate pAggInf
23e00 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79  o->aFunc[] entry
23e10 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
23e20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
23e30 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
23e40 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
23e50 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
23e60 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
23e70 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
23e80 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
23e90 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
23ea0 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20  Agg = (i16)i;.  
23eb0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
23ec0 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
23ed0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
23ee0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
23ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23f00 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
23f10 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
23f20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23f30 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
23f40 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
23f50 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
23f60 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57  elect(Walker *pW
23f70 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
23f80 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45  Select){.  UNUSE
23f90 44 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c  D_PARAMETER(pWal
23fa0 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ker);.  UNUSED_P
23fb0 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74  ARAMETER(pSelect
23fc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
23fd0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
23fe0 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70  ** Analyze the p
23ff0 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20  Expr expression 
24000 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
24010 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
24020 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
24030 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
24040 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67  o be added to Ag
24050 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  gInfo object tha
24060 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a  t pNC->pAggInfo.
24070 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ** points to.  A
24080 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
24090 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68  s are made on th
240a0 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74  e AggInfo object
240b0 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79   as.** necessary
240c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
240d0 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
240e0 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
240f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24100 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
24110 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52  yzed by sqlite3R
24120 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
24130 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
24140 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
24150 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
24160 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
24170 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
24180 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
24190 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
241a0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
241b0 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
241c0 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63  gate;.  w.xSelec
241d0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  tCallback = anal
241e0 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
241f0 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43  elect;.  w.u.pNC
24200 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74   = pNC;.  assert
24210 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
24220 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  =0 );.  sqlite3W
24230 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
24240 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  r);.}../*.** Cal
24250 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
24260 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
24270 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
24280 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
24290 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
242a0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
242b0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
242c0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
242d0 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
242e0 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
242f0 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
24300 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
24310 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
24320 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
24330 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
24340 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
24350 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
24360 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
24370 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
24380 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
24390 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
243a0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
243b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
243c0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
243d0 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
243e0 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
243f0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
24400 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65   a single new re
24410 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74  gister for use t
24420 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65  o hold some inte
24430 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e  rmediate result.
24440 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
24450 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
24460 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
24470 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
24480 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
24490 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
244a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
244b0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
244c0 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  --pParse->nTempR
244d0 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  eg];.}../*.** De
244e0 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73  allocate a regis
244f0 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69  ter, making avai
24500 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20  lable for reuse 
24510 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  for some other.*
24520 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a  * purpose..**.**
24530 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
24540 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  s currently bein
24550 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  g used by the co
24560 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  lumn cache, then
24570 0a 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74  .** the dallocat
24580 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20  ion is deferred 
24590 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e  until the column
245a0 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74   cache line that
245b0 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67   uses.** the reg
245c0 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74  ister becomes st
245d0 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ale..*/.void sql
245e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
245f0 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
24600 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
24610 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
24620 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
24630 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
24640 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69  empReg) ){.    i
24650 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
24660 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
24670 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50     for(i=0, p=pP
24680 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
24690 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
246a0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
246b0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52  .      if( p->iR
246c0 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
246d0 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
246e0 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
246f0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
24700 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  }.    pParse->aT
24710 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
24720 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
24730 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
24740 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
24750 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
24760 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
24770 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a  ve registers.*/.
24780 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
24790 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
247a0 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29  Parse, int nReg)
247b0 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
247c0 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
247d0 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
247e0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
247f0 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b    if( nReg<=n ){
24800 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 75 73  .    assert( !us
24810 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
24820 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31  pParse, i, i+n-1
24830 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ) );.    pParse-
24840 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52  >iRangeReg += nR
24850 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
24860 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65  nRangeReg -= nRe
24870 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
24880 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  i = pParse->nMem
24890 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
248a0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
248b0 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
248c0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
248d0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72  aseTempRange(Par
248e0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
248f0 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b  iReg, int nReg){
24900 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
24910 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
24920 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20  , iReg, nReg);. 
24930 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65   if( nReg>pParse
24940 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20  ->nRangeReg ){. 
24950 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
24960 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20  eReg = nReg;.   
24970 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
24980 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  eg = iReg;.  }.}
24990 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c  ../*.** Mark all
249a0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
249b0 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e  ters as being un
249c0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
249d0 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  use..*/.void sql
249e0 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
249f0 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
24a00 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
24a10 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  nTempReg = 0;.  
24a20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
24a30 67 20 3d 20 30 3b 0a 7d 0a                       g = 0;.}.