/ Hex Artifact Content
Login

Artifact 3b662f58b50ba12c004b2d9bd8d3ff5fddbbae7f:


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 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47    if( op==TK_AGG
07c0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
07d0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
07e0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 61  return sqlite3Ta
07f0: 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  bleColumnAffinit
0800: 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20 70  y(pExpr->pTab, p
0810: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
0820: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0830: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
0840: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
0850: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
0860: 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  s&EP_xIsSelect )
0870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
0880: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
0890: 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  (.        pExpr-
08a0: 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65 63  >pLeft->x.pSelec
08b0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  t->pEList->a[pEx
08c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
08d0: 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  pr.    );.  }.  
08e0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
08f0: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0900: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0910: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0920: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0930: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0940: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
0950: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
0960: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
0970: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78  nter to a new Ex
0980: 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20  pr node that.** 
0990: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43  implements the C
09a0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
09b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
09c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
09d0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74  ror occurs, that
09e0: 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65   fact is recorde
09f0: 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a  d in pParse->db.
0a00: 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72  ** and the pExpr
0a10: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65   parameter is re
0a20: 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64  turned unchanged
0a30: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0a40: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
0a50: 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  Token(.  Parse *
0a60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
0a70: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
0a80: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
0a90: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
0aa0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22 43     /* Add the "C
0ab0: 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20 74  OLLATE" clause t
0ac0: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
0ad0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  n */.  const Tok
0ae0: 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20  en *pCollName,  
0af0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
0b00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
0b10: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0b30: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 70  rue to dequote p
0b40: 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  CollName */.){. 
0b50: 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e   if( pCollName->
0b60: 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  n>0 ){.    Expr 
0b70: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
0b80: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
0b90: 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c  >db, TK_COLLATE,
0ba0: 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75   pCollName, dequ
0bb0: 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ote);.    if( pN
0bc0: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
0bd0: 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b  ->pLeft = pExpr;
0be0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
0bf0: 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65  gs |= EP_Collate
0c00: 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20  |EP_Skip;.      
0c10: 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
0c20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
0c30: 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a   pExpr;.}.Expr *
0c40: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0c50: 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72 73  llateString(Pars
0c60: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
0c70: 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63 68  *pExpr, const ch
0c80: 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e  ar *zC){.  Token
0c90: 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   s;.  assert( zC
0ca0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
0cb0: 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28 63  TokenInit(&s, (c
0cc0: 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75  har*)zC);.  retu
0cd0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 64  rn sqlite3ExprAd
0ce0: 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
0cf0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73 2c  arse, pExpr, &s,
0d00: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b   0);.}../*.** Sk
0d10: 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43  ip over any TK_C
0d20: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
0d30: 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c   and any unlikel
0d40: 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69  y().** or likeli
0d50: 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  hood() function 
0d60: 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  at the root of a
0d70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  n expression..*/
0d80: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
0d90: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78  prSkipCollate(Ex
0da0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 68  pr *pExpr){.  wh
0db0: 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45 78  ile( pExpr && Ex
0dc0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0dd0: 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b  xpr, EP_Skip) ){
0de0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
0df0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0e00: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0e10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
0e20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0e30: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
0e40: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ct) );.      ass
0e50: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
0e60: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
0e70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
0e80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
0e90: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45  TION );.      pE
0ea0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  xpr = pExpr->x.p
0eb0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
0ec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0ed0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0ee0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0ef0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20   );.      pExpr 
0f00: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
0f10: 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72      }.  }   .  r
0f20: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
0f30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0f40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0f50: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
0f60: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
0f70: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
0f80: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
0f90: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
0fa0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
0fb0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
0fc0: 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64  uence might be d
0fd0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43  etermined by a C
0fe0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a  OLLATE operator.
0ff0: 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72 65  ** or by the pre
1000: 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d  sence of a colum
1010: 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  n with a defined
1020: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1030: 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20  nce..** COLLATE 
1040: 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66  operators take f
1050: 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e  irst precedence.
1060: 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20    Left operands 
1070: 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e  take.** preceden
1080: 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70  ce over right op
1090: 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53  erands..*/.CollS
10a0: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
10b0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
10c0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
10d0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
10e0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10f0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1100: 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20   = 0;.  Expr *p 
1110: 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  = pExpr;.  while
1120: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  ( p ){.    int o
1130: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69  p = p->op;.    i
1140: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
1150: 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b  _Generic ) break
1160: 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b  ;.    if( op==TK
1170: 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  _CAST || op==TK_
1180: 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 70  UPLUS ){.      p
1190: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
11a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
11b0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
11c0: 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70  K_COLLATE || (op
11d0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
11e0: 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c   p->op2==TK_COLL
11f0: 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70 43  ATE) ){.      pC
1200: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
1210: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1220: 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75  ENC(db), 0, p->u
1230: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1240: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1250: 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47   if( (op==TK_AGG
1260: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
1270: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1280: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
1290: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
12a0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26 26  TRIGGER).     &&
12b0: 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20   p->pTab!=0.    
12c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d  ){.      /* op==
12d0: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
12e0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
12f0: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
1300: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
1310: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
1320: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
1330: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
1340: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
1350: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
1360: 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75  int j = p->iColu
1370: 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e  mn;.      if( j>
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
1390: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
13a0: 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  = p->pTab->aCol[
13b0: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
13c0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
13d0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
13e0: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
13f0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1410: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
1420: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
1430: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
1440: 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66 74  eft && (p->pLeft
1450: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
1460: 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  late)!=0 ){.    
1470: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
1480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1490: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
14a0: 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b  xt  = p->pRight;
14b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
14c0: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
14d0: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
14e0: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
14f0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
1500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1510: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
1520: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1530: 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61         /* p->fla
1540: 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c  gs holds EP_Coll
1550: 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74  ate and p->pLeft
1560: 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74  ->flags does not
1570: 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20 2a  .  And.        *
1580: 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63  * p->x.pSelect c
1590: 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d  annot.  So if p-
15a0: 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73 2c  >x.pLeft exists,
15b0: 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61 74   it must hold at
15c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 73  .        ** leas
15d0: 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65  t one EP_Collate
15e0: 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f  . Thus the follo
15f0: 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53 2e  wing two ALWAYS.
1600: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1610: 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26  p->x.pList!=0 &&
1620: 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61 73   ALWAYS(!ExprHas
1630: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
1640: 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20 20  IsSelect)) ){.  
1650: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
1660: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1670: 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e  ; ALWAYS(i<p->x.
1680: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69  pList->nExpr); i
1690: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
16a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16b0: 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d  erty(p->x.pList-
16c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  >a[i].pExpr, EP_
16d0: 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  Collate) ){.    
16e0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74 20            pNext 
16f0: 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  = p->x.pList->a[
1700: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1720: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1740: 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70   }.        p = p
1750: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
1770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1780: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65    if( sqlite3Che
1790: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
17a0: 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20  , pColl) ){ .   
17b0: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a   pColl = 0;.  }.
17c0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
17d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
17e0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
17f0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1800: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1810: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1820: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1830: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1840: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1850: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1860: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1870: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1880: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1890: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
18a0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
18b0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
18c0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
18d0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
18e0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
18f0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1900: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1910: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1920: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1930: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1940: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1950: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1960: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1970: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1980: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1990: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
19a0: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
19b0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
19c0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
19d0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
19e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19f0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1a10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1a20: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1a30: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1a40: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1a50: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1a60: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1a70: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1a80: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1a90: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1aa0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1ac0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ad0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ae0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1af0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1b00: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1b10: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1b20: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1b30: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1b40: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1b50: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1b60: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1b70: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1b80: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1b90: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1ba0: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1bb0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1bc0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1bd0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1be0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1bf0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1c00: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
1c10: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
1c20: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
1c30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
1c40: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1c50: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
1c60: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
1c70: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
1c80: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
1c90: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
1ca0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
1cb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1cc0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
1cd0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
1ce0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1cf0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
1d00: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
1d10: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
1d20: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1d30: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1d40: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
1d50: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
1d60: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1d70: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
1d80: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
1d90: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
1da0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1db0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1dc0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
1dd0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1de0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1df0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1e00: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
1e10: 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 61 66  lse if( NEVER(af
1e20: 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 61 66 66  f==0) ){.    aff
1e30: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
1e40: 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OB;.  }.  return
1e50: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70   aff;.}../*.** p
1e60: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
1e70: 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  ison expression,
1e80: 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49   eg. '=', '<', I
1e90: 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69  N(...) etc..** i
1ea0: 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74  dx_affinity is t
1eb0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61  he affinity of a
1ec0: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
1ed0: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a  . Return true.**
1ee0: 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69   if the index wi
1ef0: 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f  th affinity idx_
1f00: 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20  affinity may be 
1f10: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1f20: 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  t.** the compari
1f30: 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f  son in pExpr..*/
1f40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
1f50: 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72  xAffinityOk(Expr
1f60: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64   *pExpr, char id
1f70: 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63  x_affinity){.  c
1f80: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
1f90: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
1fa0: 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61  pr);.  switch( a
1fb0: 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ff ){.    case S
1fc0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a  QLITE_AFF_BLOB:.
1fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ff0: 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
2000: 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e  return idx_affin
2010: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
2020: 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75 6c  TEXT;.    defaul
2030: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
2040: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
2050: 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66  Affinity(idx_aff
2060: 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  inity);.  }.}../
2070: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2080: 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73 68  P5 value that sh
2090: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
20a0: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
20b0: 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28  ison.** opcode (
20c0: 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63  OP_Eq, OP_Ge etc
20d0: 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  .) used to compa
20e0: 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70 45  re pExpr1 and pE
20f0: 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xpr2..*/.static 
2100: 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65  u8 binaryCompare
2110: 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c  P5(Expr *pExpr1,
2120: 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69   Expr *pExpr2, i
2130: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
2140: 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61 72    u8 aff = (char
2150: 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69  )sqlite3ExprAffi
2160: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
2170: 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69 74 65  aff = (u8)sqlite
2180: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
2190: 28 70 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20  (pExpr1, aff) | 
21a0: 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a  (u8)jumpIfNull;.
21b0: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
21c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21d0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
21e0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
21f0: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2200: 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69   used by.** a bi
2210: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  nary comparison 
2220: 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69  operator compari
2230: 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  ng pLeft and pRi
2240: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ght..**.** If th
2250: 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72  e left hand expr
2260: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
2270: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
2280: 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73  type, then it is
2290: 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77  .** used. Otherw
22a0: 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ise the collatio
22b0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
22c0: 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 65 78  he right hand ex
22d0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75  pression.** is u
22e0: 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61  sed, or the defa
22f0: 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66 20  ult (BINARY) if 
2300: 6e 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69  neither expressi
2310: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
2320: 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a  ng.** type..**.*
2330: 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69 67 68  * Argument pRigh
2340: 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65 66 74  t (but not pLeft
2350: 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c 20  ) may be a null 
2360: 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68 69 73  pointer. In this
2370: 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20   case,.** it is 
2380: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  not considered..
2390: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
23a0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
23b0: 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65  CollSeq(.  Parse
23c0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70   *pParse, .  Exp
23d0: 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70  r *pLeft, .  Exp
23e0: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43  r *pRight.){.  C
23f0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
2400: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
2410: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66  ;.  if( pLeft->f
2420: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2430: 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  e ){.    pColl =
2440: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2450: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2460: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
2470: 70 52 69 67 68 74 20 26 26 20 28 70 52 69 67 68  pRight && (pRigh
2480: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
2490: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
24a0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
24b0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
24c0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  se, pRight);.  }
24d0: 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  else{.    pColl 
24e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
24f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
2500: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  ft);.    if( !pC
2510: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
2520: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2530: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2540: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
2550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
2560: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  l;.}../*.** Gene
2570: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
2580: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
2590: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
25a0: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
25b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
25d0: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
25e0: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
25f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2600: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
2610: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2620: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2630: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
2640: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2650: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
2660: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
2670: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2680: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
2690: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
26a0: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
26b0: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
26c0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
26d0: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
26e0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
26f0: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
2700: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
2710: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
2720: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
2730: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
2740: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
2750: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
2760: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
2770: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
2780: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
2790: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
27a0: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
27b0: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
27c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
27d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
27e0: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
27f0: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
2820: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
2830: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2840: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2850: 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74 75 72  (u8)p5);.  retur
2860: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
2870: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2880: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
2890: 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 6f 72   is a vector, or
28a0: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
28b0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74 6f 72  ..**.** A vector
28c0: 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20 61   is defined as a
28d0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
28e0: 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20 74 77  at results in tw
28f0: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c  o or more.** col
2900: 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74 2e 20  umns of result. 
2910: 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54 4f 52   Every TK_VECTOR
2920: 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65 63 74   node is an vect
2930: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  or because the.*
2940: 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20 6e 6f  * parser will no
2950: 74 20 67 65 6e 65 72 61 74 65 20 61 20 54 4b 5f  t generate a TK_
2960: 56 45 43 54 4f 52 20 77 69 74 68 20 66 65 77 65  VECTOR with fewe
2970: 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74 72 69  r than two entri
2980: 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54 4b 5f  es..** But a TK_
2990: 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62 65 20  SELECT might be 
29a0: 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20  either a vector 
29b0: 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49 74 20  or a scalar. It 
29c0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69  is only.** consi
29d0: 64 65 72 65 64 20 61 20 76 65 63 74 6f 72 20 69  dered a vector i
29e0: 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f 72 20  f it has two or 
29f0: 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  more result colu
2a00: 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mns..*/.int sqli
2a10: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
2a20: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2a30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
2a40: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
2a50: 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pr)>1;.}../*.** 
2a60: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
2a70: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
2a80: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73  only argument is
2a90: 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54   of type TK_VECT
2aa0: 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  OR .** return th
2ab0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 70 72  e number of expr
2ac0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 76  essions in the v
2ad0: 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20 74 68  ector. Or, if th
2ae0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
2af0: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c  is a sub-select,
2b00: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
2b10: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2b20: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
2b30: 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74 68 65   For.** any othe
2b40: 72 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73  r type of expres
2b50: 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31 2e 0a  sion, return 1..
2b60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2b70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45 78 70  prVectorSize(Exp
2b80: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 38 20  r *pExpr){.  u8 
2b90: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
2ba0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
2bb0: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 45 78  ISTER ) op = pEx
2bc0: 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28 20 6f  pr->op2;.  if( o
2bd0: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 7b 0a  p==TK_VECTOR ){.
2be0: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
2bf0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2c00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2c10: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
2c20: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
2c30: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
2c40: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2c50: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
2c60: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
2c70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2c80: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 52 65 74 75  QUERY./*.** Retu
2c90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2ca0: 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  a subexpression 
2cb0: 6f 66 20 70 56 65 63 74 6f 72 20 74 68 61 74 20  of pVector that 
2cc0: 69 73 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63  is the i-th.** c
2cd0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
2ce0: 74 6f 72 20 28 6e 75 6d 62 65 72 65 64 20 73 74  tor (numbered st
2cf0: 61 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20  arting with 0). 
2d00: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
2d10: 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20  .** ensure that 
2d20: 69 20 69 73 20 77 69 74 68 69 6e 20 72 61 6e 67  i is within rang
2d30: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63  e..**.** If pVec
2d40: 74 6f 72 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tor is really a 
2d50: 73 63 61 6c 61 72 20 28 61 6e 64 20 22 73 63 61  scalar (and "sca
2d60: 6c 61 72 22 20 68 65 72 65 20 69 6e 63 6c 75 64  lar" here includ
2d70: 65 73 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  es subqueries.**
2d80: 20 74 68 61 74 20 72 65 74 75 72 6e 20 61 20 73   that return a s
2d90: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74  ingle column!) t
2da0: 68 65 6e 20 72 65 74 75 72 6e 20 70 56 65 63 74  hen return pVect
2db0: 6f 72 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  or unmodified..*
2dc0: 2a 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74  *.** pVector ret
2dd0: 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f  ains ownership o
2de0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  f the returned s
2df0: 75 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  ubexpression..**
2e00: 0a 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f  .** If the vecto
2e10: 72 20 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e  r is a (SELECT .
2e20: 2e 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78 70  ..) then the exp
2e30: 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64  ression returned
2e40: 20 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20   is.** just the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74  expression for t
2e60: 68 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20  he i-th term of 
2e70: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
2e80: 61 6e 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62  and may.** not b
2e90: 65 20 72 65 61 64 79 20 66 6f 72 20 65 76 61 6c  e ready for eval
2ea0: 75 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74  uation because t
2eb0: 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  he table cursor 
2ec0: 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62  has not yet.** b
2ed0: 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a  een positioned..
2ee0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2ef0: 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
2f00: 70 72 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72  pr(Expr *pVector
2f10: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
2f20: 72 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70  rt( i<sqlite3Exp
2f30: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63  rVectorSize(pVec
2f40: 74 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71  tor) );.  if( sq
2f50: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2f60: 72 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20  r(pVector) ){.  
2f70: 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74 6f    assert( pVecto
2f80: 72 2d 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65  r->op2==0 || pVe
2f90: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  ctor->op==TK_REG
2fa0: 49 53 54 45 52 20 29 3b 0a 20 20 20 20 69 66 28  ISTER );.    if(
2fb0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
2fc0: 5f 53 45 4c 45 43 54 20 7c 7c 20 70 56 65 63 74  _SELECT || pVect
2fd0: 6f 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45  or->op2==TK_SELE
2fe0: 43 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  CT ){.      retu
2ff0: 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53  rn pVector->x.pS
3000: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
3010: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [i].pExpr;.    }
3020: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
3030: 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c  rn pVector->x.pL
3040: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
3050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3060: 75 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 23  urn pVector;.}.#
3070: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
3080: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
3090: 42 51 55 45 52 59 29 20 2a 2f 0a 0a 23 69 66 6e  BQUERY) */..#ifn
30a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30b0: 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 43  SUBQUERY./*.** C
30c0: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
30d0: 6e 20 61 20 6e 65 77 20 45 78 70 72 20 6f 62 6a  n a new Expr obj
30e0: 65 63 74 20 77 68 69 63 68 20 77 68 65 6e 20 70  ect which when p
30f0: 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73 71 6c 69  assed to.** sqli
3100: 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 77 69  te3ExprCode() wi
3110: 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 6c 6c 20  ll generate all 
3120: 6e 65 63 65 73 73 61 72 79 20 63 6f 64 65 20 74  necessary code t
3130: 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  o compute.** the
3140: 20 69 46 69 65 6c 64 2d 74 68 20 63 6f 6c 75 6d   iField-th colum
3150: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
3160: 65 78 70 72 65 73 73 69 6f 6e 20 70 56 65 63 74  expression pVect
3170: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  or..**.** It is 
3180: 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f 72 20 74  ok for pVector t
3190: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 28 61  o be a scalar (a
31a0: 73 20 6c 6f 6e 67 20 61 73 20 69 46 69 65 6c 64  s long as iField
31b0: 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e 20 74 68  ==0).  .** In th
31c0: 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  at case, this ro
31d0: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
31e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
31f0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
3200: 6c 65 72 20 6f 77 6e 73 20 74 68 65 20 72 65 74  ler owns the ret
3210: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3220: 74 20 61 6e 64 20 69 73 20 72 65 73 70 6f 6e 73  t and is respons
3230: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65 6e 73 75  ible for.** ensu
3240: 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65  ring that the re
3250: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 65 76 65  turned value eve
3260: 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65  ntually gets fre
3270: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ed..**.** The ca
3280: 6c 6c 65 72 20 72 65 74 61 69 6e 73 20 6f 77 6e  ller retains own
3290: 65 72 73 68 69 70 20 6f 66 20 70 56 65 63 74 6f  ership of pVecto
32a0: 72 2e 20 20 49 66 20 70 56 65 63 74 6f 72 20 69  r.  If pVector i
32b0: 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a  s a TK_SELECT,.*
32c0: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  * then the retur
32d0: 6e 65 64 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ned object will 
32e0: 72 65 66 65 72 65 6e 63 65 20 70 56 65 63 74 6f  reference pVecto
32f0: 72 20 61 6e 64 20 73 6f 20 70 56 65 63 74 6f 72  r and so pVector
3300: 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a 2a 2a 20   must remain.** 
3310: 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6c 69  valid for the li
3320: 66 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  fe of the return
3330: 65 64 20 6f 62 6a 65 63 74 2e 20 20 49 66 20 70  ed object.  If p
3340: 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 56  Vector is a TK_V
3350: 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61 20 73 63  ECTOR.** or a sc
3360: 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2c  alar expression,
3370: 20 74 68 65 6e 20 69 74 20 63 61 6e 20 62 65 20   then it can be 
3380: 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f 6e 20  deleted as soon 
3390: 61 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  as this routine.
33a0: 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  ** returns..**.*
33b0: 2a 20 41 20 74 72 69 63 6b 20 74 6f 20 63 61 75  * A trick to cau
33c0: 73 65 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 70  se a TK_SELECT p
33d0: 56 65 63 74 6f 72 20 74 6f 20 62 65 20 64 65 6c  Vector to be del
33e0: 65 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69  eted together wi
33f0: 74 68 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e  th.** the return
3400: 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 69  ed Expr object i
3410: 73 20 74 6f 20 61 74 74 61 63 68 20 74 68 65 20  s to attach the 
3420: 70 56 65 63 74 6f 72 20 74 6f 20 74 68 65 20 70  pVector to the p
3430: 52 69 67 68 74 20 66 69 65 6c 64 0a 2a 2a 20 6f  Right field.** o
3440: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 54  f the returned T
3450: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
3460: 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Expr object..*/.
3470: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3480: 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28  rForVectorField(
3490: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
34a0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
34b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
34c0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20  Expr *pVector,  
34d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74       /* The vect
34e0: 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20 65 78 70  or.  List of exp
34f0: 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75  ressions or a su
3500: 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e  b-SELECT */.  in
3510: 74 20 69 46 69 65 6c 64 20 20 20 20 20 20 20 20  t iField        
3520: 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75     /* Which colu
3530: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
3540: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b   to return */.){
3550: 0a 20 20 45 78 70 72 20 2a 70 52 65 74 3b 0a 20  .  Expr *pRet;. 
3560: 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70   if( pVector->op
3570: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
3580: 20 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74     assert( pVect
3590: 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  or->flags & EP_x
35a0: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
35b0: 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c 45 43 54  /* The TK_SELECT
35c0: 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6e 6f 64  _COLUMN Expr nod
35d0: 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
35e0: 20 70 4c 65 66 74 3a 20 20 20 20 20 20 20 20 20   pLeft:         
35f0: 20 20 70 56 65 63 74 6f 72 20 63 6f 6e 74 61 69    pVector contai
3600: 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43 54 0a 20  ning TK_SELECT. 
3610: 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20 20 20     ** pRight:   
3620: 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65 64 2e         not used.
3630: 20 20 42 75 74 20 72 65 63 75 72 73 69 76 65 6c    But recursivel
3640: 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  y deleted..    *
3650: 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20 20 20  * iColumn:      
3660: 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20 63 6f     Index of a co
3670: 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f 72 0a  lumn in pVector.
3680: 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69 54      ** pLeft->iT
3690: 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69 6e  able:   First in
36a0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
36b0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65  ister holding re
36c0: 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20 2a  sult, or 0.    *
36d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
36e0: 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c 74     if the result
36f0: 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d 70   is not yet comp
3700: 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uted..    **.   
3710: 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44   ** sqlite3ExprD
3720: 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69 63  elete() specific
3730: 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20 72  ally skips the r
3740: 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65 20  ecursive delete 
3750: 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 20  of.    ** pLeft 
3760: 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  on TK_SELECT_COL
3770: 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74 20  UMN nodes.  But 
3780: 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f 77  pRight is follow
3790: 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a 20  ed, so pVector. 
37a0: 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74 74     ** can be att
37b0: 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74 20  ached to pRight 
37c0: 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e 6f  to cause this no
37d0: 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65 72  de to take owner
37e0: 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20 70  ship of.    ** p
37f0: 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61 6c  Vector.  Typical
3800: 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65  ly there will be
3810: 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45 4c   multiple TK_SEL
3820: 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73  ECT_COLUMN nodes
3830: 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
3840: 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69 6e   same pLeft poin
3850: 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63 74  ter to the pVect
3860: 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e 65  or, but only one
3870: 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
3880: 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56 65  will own the pVe
3890: 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctor..    */.   
38a0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 50   pRet = sqlite3P
38b0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
38c0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20 30  SELECT_COLUMN, 0
38d0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 52  , 0);.    if( pR
38e0: 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65 74  et ){.      pRet
38f0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69 65  ->iColumn = iFie
3900: 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e  ld;.      pRet->
3910: 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72 3b  pLeft = pVector;
3920: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
3930: 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70 52  t( pRet==0 || pR
3940: 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 3b  et->iTable==0 );
3950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
3960: 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  ( pVector->op==T
3970: 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63 74  K_VECTOR ) pVect
3980: 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e  or = pVector->x.
3990: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d  pList->a[iField]
39a0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65 74  .pExpr;.    pRet
39b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
39c0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 56  p(pParse->db, pV
39d0: 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  ector, 0);.  }. 
39e0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
39f0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
3a00: 65 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  e(SQLITE_OMIT_SU
3a10: 42 51 55 45 52 59 29 20 2a 2f 0a 0a 2f 2a 0a 2a  BQUERY) */../*.*
3a20: 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20  * If expression 
3a30: 70 45 78 70 72 20 69 73 20 6f 66 20 74 79 70 65  pExpr is of type
3a40: 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65   TK_SELECT, gene
3a50: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
3a60: 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74  luate.** it. Ret
3a70: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
3a80: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3a90: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28  sult is stored (
3aa0: 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73  or, if the .** s
3ab0: 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
3ac0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
3ad0: 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73  column, the firs
3ae0: 74 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a  t in an array.**
3af0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 69 6e   of registers in
3b00: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
3b10: 74 20 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a  t is stored)..**
3b20: 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
3b30: 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  not a TK_SELECT 
3b40: 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75  expression, retu
3b50: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
3b60: 69 6e 74 20 65 78 70 72 43 6f 64 65 53 75 62 73  int exprCodeSubs
3b70: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
3b80: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
3b90: 29 7b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30  ){.  int reg = 0
3ba0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3bb0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
3bc0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
3bd0: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
3be0: 20 72 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f   reg = sqlite3Co
3bf0: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
3c00: 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
3c10: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
3c20: 65 74 75 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a  eturn reg;.}../*
3c30: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 65  .** Argument pVe
3c40: 63 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ctor points to a
3c50: 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   vector expressi
3c60: 6f 6e 20 2d 20 65 69 74 68 65 72 20 61 20 54 4b  on - either a TK
3c70: 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b  _VECTOR.** or TK
3c80: 5f 53 45 4c 45 43 54 20 74 68 61 74 20 72 65 74  _SELECT that ret
3c90: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
3ca0: 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20  ne column. This 
3cb0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
3cc0: 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
3cd0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
3ce0: 69 73 74 65 72 20 74 68 61 74 20 63 6f 6e 74 61  ister that conta
3cf0: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
3d00: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 69 46 69 65  .** element iFie
3d10: 6c 64 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  ld of the vector
3d20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74  ..**.** If pVect
3d30: 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43  or is a TK_SELEC
3d40: 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  T expression, th
3d50: 65 6e 20 63 6f 64 65 20 66 6f 72 20 69 74 20 6d  en code for it m
3d60: 75 73 74 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72  ust have .** alr
3d70: 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61  eady been genera
3d80: 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 65 78  ted using the ex
3d90: 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  prCodeSubselect(
3da0: 29 20 72 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68  ) routine. In th
3db0: 69 73 0a 2a 2a 20 63 61 73 65 20 70 61 72 61 6d  is.** case param
3dc0: 65 74 65 72 20 72 65 67 53 65 6c 65 63 74 20 73  eter regSelect s
3dd0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 66 69 72  hould be the fir
3de0: 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
3df0: 66 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 63  f registers.** c
3e00: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65  ontaining the re
3e10: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 75 62  sults of the sub
3e20: 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20  -select. .**.** 
3e30: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 6f 66  If pVector is of
3e40: 20 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c   type TK_VECTOR,
3e50: 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 74   then code for t
3e60: 68 65 20 72 65 71 75 65 73 74 65 64 20 66 69 65  he requested fie
3e70: 6c 64 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  ld.** is generat
3e80: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3e90: 20 28 2a 70 52 65 67 46 72 65 65 29 20 6d 61 79   (*pRegFree) may
3ea0: 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e   be set to the n
3eb0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65  umber of.** a te
3ec0: 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
3ed0: 20 74 6f 20 62 65 20 66 72 65 65 64 20 62 79 20   to be freed by 
3ee0: 74 68 65 20 63 61 6c 6c 65 72 20 62 65 66 6f 72  the caller befor
3ef0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
3f00: 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
3f10: 69 6e 67 2c 20 6f 75 74 70 75 74 20 70 61 72 61  ing, output para
3f20: 6d 65 74 65 72 20 28 2a 70 70 45 78 70 72 29 20  meter (*ppExpr) 
3f30: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
3f40: 74 6f 20 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f  to the.** Expr o
3f50: 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
3f60: 69 6e 67 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69  ing to element i
3f70: 45 6c 65 6d 20 6f 66 20 74 68 65 20 76 65 63 74  Elem of the vect
3f80: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
3f90: 74 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  t exprVectorRegi
3fa0: 73 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ster(.  Parse *p
3fb0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
3fc0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
3fd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
3fe0: 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20  pr *pVector,    
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4000: 20 56 65 63 74 6f 72 20 74 6f 20 65 78 74 72 61   Vector to extra
4010: 63 74 20 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20  ct element from 
4020: 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 2c  */.  int iField,
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f       /* Field to
4050: 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70 56   extract from pV
4060: 65 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ector */.  int r
4070: 65 67 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  egSelect,       
4080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4090: 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20  rst in array of 
40a0: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 45  registers */.  E
40b0: 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20  xpr **ppExpr,   
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
40d0: 2a 20 4f 55 54 3a 20 45 78 70 72 65 73 73 69 6f  * OUT: Expressio
40e0: 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  n element */.  i
40f0: 6e 74 20 2a 70 52 65 67 46 72 65 65 20 20 20 20  nt *pRegFree    
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4110: 2a 20 4f 55 54 3a 20 54 65 6d 70 20 72 65 67 69  * OUT: Temp regi
4120: 73 74 65 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a  ster to free */.
4130: 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 56 65  ){.  u8 op = pVe
4140: 63 74 6f 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65  ctor->op;.  asse
4150: 72 74 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f  rt( op==TK_VECTO
4160: 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49  R || op==TK_REGI
4170: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53  STER || op==TK_S
4180: 45 4c 45 43 54 20 29 3b 0a 20 20 69 66 28 20 6f  ELECT );.  if( o
4190: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
41a0: 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20  {.    *ppExpr = 
41b0: 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
41c0: 6c 64 53 75 62 65 78 70 72 28 70 56 65 63 74 6f  ldSubexpr(pVecto
41d0: 72 2c 20 69 46 69 65 6c 64 29 3b 0a 20 20 20 20  r, iField);.    
41e0: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e  return pVector->
41f0: 69 54 61 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20  iTable+iField;. 
4200: 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f   }.  if( op==TK_
4210: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 2a 70  SELECT ){.    *p
4220: 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d  pExpr = pVector-
4230: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
4240: 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45  st->a[iField].pE
4250: 78 70 72 3b 0a 20 20 20 20 20 72 65 74 75 72 6e  xpr;.     return
4260: 20 72 65 67 53 65 6c 65 63 74 2b 69 46 69 65 6c   regSelect+iFiel
4270: 64 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72  d;.  }.  *ppExpr
4280: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c   = pVector->x.pL
4290: 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70  ist->a[iField].p
42a0: 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 73  Expr;.  return s
42b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
42c0: 6d 70 28 70 50 61 72 73 65 2c 20 2a 70 70 45 78  mp(pParse, *ppEx
42d0: 70 72 2c 20 70 52 65 67 46 72 65 65 29 3b 0a 7d  pr, pRegFree);.}
42e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
42f0: 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  on pExpr is a co
4300: 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e  mparison between
4310: 20 74 77 6f 20 76 65 63 74 6f 72 20 76 61 6c 75   two vector valu
4320: 65 73 2e 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74  es. Compute.** t
4330: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
4340: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20   comparison (1, 
4350: 30 2c 20 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20  0, or NULL) and 
4360: 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 72 65  write that.** re
4370: 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74  sult into regist
4380: 65 72 20 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  er dest..**.** T
4390: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 73  he caller must s
43a0: 61 74 69 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f  atisfy the follo
43b0: 77 69 6e 67 20 70 72 65 63 6f 6e 64 69 74 69 6f  wing preconditio
43c0: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20  ns:.**.**    if 
43d0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
43e0: 3a 20 20 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51  :      op==TK_EQ
43f0: 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f   and p5==SQLITE_
4400: 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20  NULLEQ.**    if 
4410: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4420: 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45  NOT:   op==TK_NE
4430: 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f   and p5==SQLITE_
4440: 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68  NULLEQ.**    oth
4450: 65 72 77 69 73 65 3a 20 20 20 20 20 20 20 20 20  erwise:         
4460: 20 20 20 20 20 20 20 6f 70 3d 3d 70 45 78 70 72         op==pExpr
4470: 2d 3e 6f 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a  ->op and p5==0.*
4480: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
4490: 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28  deVectorCompare(
44a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
44b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ,        /* Code
44c0: 20 67 65 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65   generator conte
44d0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
44e0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
44f0: 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
4500: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
4510: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
4520: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
4530: 73 75 6c 74 73 20 69 6e 74 6f 20 74 68 69 73 20  sults into this 
4540: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38  register */.  u8
4550: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
4560: 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
4570: 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  n operator */.  
4580: 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20  u8 p5           
4590: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
45a0: 4e 55 4c 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a  NULLEQ or zero *
45b0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
45c0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
45d0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
45e0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
45f0: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
4600: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
4610: 69 6e 74 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69  int nLeft = sqli
4620: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
4630: 65 28 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20  e(pLeft);.  int 
4640: 69 3b 0a 20 20 69 6e 74 20 72 65 67 4c 65 66 74  i;.  int regLeft
4650: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 52   = 0;.  int regR
4660: 69 67 68 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f  ight = 0;.  u8 o
4670: 70 78 20 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61  px = op;.  int a
4680: 64 64 72 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65  ddrDone = sqlite
4690: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
46a0: 29 3b 0a 0a 20 20 69 66 28 20 6e 4c 65 66 74 21  );..  if( nLeft!
46b0: 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74  =sqlite3ExprVect
46c0: 6f 72 53 69 7a 65 28 70 52 69 67 68 74 29 20 29  orSize(pRight) )
46d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
46e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
46f0: 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
4700: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
4710: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45    }.  assert( pE
4720: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
4730: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4740: 4e 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45  NE .       || pE
4750: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
4760: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4770: 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20 7c 7c  ISNOT .       ||
4780: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
4790: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
47a0: 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20 7c 7c  TK_GT .       ||
47b0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
47c0: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
47d0: 54 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20 61 73  TK_GE .  );.  as
47e0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
47f0: 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f  =op || (pExpr->o
4800: 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d  p==TK_IS && op==
4810: 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20  TK_EQ).         
4820: 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70     || (pExpr->op
4830: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20 6f 70  ==TK_ISNOT && op
4840: 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20 61 73  ==TK_NE) );.  as
4850: 73 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70  sert( p5==0 || p
4860: 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a  Expr->op!=op );.
4870: 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51    assert( p5==SQ
4880: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70  LITE_NULLEQ || p
4890: 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a  Expr->op==op );.
48a0: 0a 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f  .  p5 |= SQLITE_
48b0: 53 54 4f 52 45 50 32 3b 0a 20 20 69 66 28 20 6f  STOREP2;.  if( o
48c0: 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20  px==TK_LE ) opx 
48d0: 3d 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28 20 6f  = TK_LT;.  if( o
48e0: 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20  px==TK_GE ) opx 
48f0: 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65 67 4c  = TK_GT;..  regL
4900: 65 66 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75  eft = exprCodeSu
4910: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
4920: 70 4c 65 66 74 29 3b 0a 20 20 72 65 67 52 69 67  pLeft);.  regRig
4930: 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62  ht = exprCodeSub
4940: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
4950: 52 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72 28 69  Right);..  for(i
4960: 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65 78 69  =0; 1 /*Loop exi
4970: 74 73 20 62 79 20 22 62 72 65 61 6b 22 2a 2f 3b  ts by "break"*/;
4980: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   i++){.    int r
4990: 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67  egFree1 = 0, reg
49a0: 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 45  Free2 = 0;.    E
49b0: 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20  xpr *pL, *pR; . 
49c0: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20     int r1, r2;. 
49d0: 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
49e0: 26 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20  && i<nLeft );.  
49f0: 20 20 69 66 28 20 69 3e 30 20 29 20 73 71 6c 69    if( i>0 ) sqli
4a00: 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
4a10: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 31  (pParse);.    r1
4a20: 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67   = exprVectorReg
4a30: 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c  ister(pParse, pL
4a40: 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c  eft, i, regLeft,
4a50: 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29   &pL, &regFree1)
4a60: 3b 0a 20 20 20 20 72 32 20 3d 20 65 78 70 72 56  ;.    r2 = exprV
4a70: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50  ectorRegister(pP
4a80: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69 2c  arse, pRight, i,
4a90: 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c 20   regRight, &pR, 
4aa0: 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
4ab0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
4ac0: 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c  se, pL, pR, opx,
4ad0: 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 70   r1, r2, dest, p
4ae0: 35 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  5);.    testcase
4af0: 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
4b00: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4b10: 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65  ==OP_Lt);.    te
4b20: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
4b30: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4b40: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
4b50: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4b60: 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
4b70: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4b80: 5f 47 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Gt);.    testca
4b90: 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
4ba0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4bb0: 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
4bc0: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4bd0: 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
4be0: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
4bf0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4c00: 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
4c10: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4c20: 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69  OP_Ne);.    sqli
4c30: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4c40: 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
4c50: 65 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e1);.    sqlite3
4c60: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
4c70: 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
4c80: 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 20  ;.    if( i>0 ) 
4c90: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
4ca0: 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
4cb0: 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 31 20   if( i==nLeft-1 
4cc0: 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
4cd0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
4ce0: 78 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20  x==TK_EQ ){.    
4cf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d00: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op2(v, OP_IfNot,
4d10: 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29   dest, addrDone)
4d20: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4d30: 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d 20 53  );.      p5 |= S
4d40: 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a  QLITE_KEEPNULL;.
4d50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
4d60: 78 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20 20 20 20  x==TK_NE ){.    
4d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d80: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 64 65  Op2(v, OP_If, de
4d90: 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56  st, addrDone); V
4da0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4db0: 20 20 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49        p5 |= SQLI
4dc0: 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20  TE_KEEPNULL;.   
4dd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
4de0: 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20  sert( op==TK_LT 
4df0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20  || op==TK_GT || 
4e00: 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op==TK_LE || op=
4e10: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
4e20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4e30: 32 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45  2(v, OP_ElseNotE
4e40: 71 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b  q, 0, addrDone);
4e50: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
4e60: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
4e70: 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LT);.      VdbeC
4e80: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
4e90: 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56  =TK_GT);.      V
4ea0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4eb0: 20 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20   op==TK_LE);.   
4ec0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
4ed0: 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 45 29 3b  f(v, op==TK_GE);
4ee0: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c  .      if( i==nL
4ef0: 65 66 74 2d 32 20 29 20 6f 70 78 20 3d 20 6f 70  eft-2 ) opx = op
4f00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
4f10: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
4f20: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e  Label(v, addrDon
4f30: 65 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  e);.}..#if SQLIT
4f40: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
4f50: 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  >0./*.** Check t
4f60: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65  hat argument nHe
4f70: 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61  ight is less tha
4f80: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
4f90: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70  e maximum.** exp
4fa0: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c  ression depth al
4fb0: 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20  lowed. If it is 
4fc0: 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  not, leave an er
4fd0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a  ror message in.*
4fe0: 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74  * pParse..*/.int
4ff0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
5000: 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  kHeight(Parse *p
5010: 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67  Parse, int nHeig
5020: 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ht){.  int rc = 
5030: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
5040: 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72   mxHeight = pPar
5050: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
5060: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
5070: 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e  _DEPTH];.  if( n
5080: 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20  Height>mxHeight 
5090: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
50a0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
50b0: 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69         "Expressi
50c0: 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c  on tree is too l
50d0: 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65  arge (maximum de
50e0: 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67  pth %d)", mxHeig
50f0: 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  ht.    );.    rc
5100: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
5110: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5120: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;.}../* The foll
5130: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
5140: 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45  tions, heightOfE
5150: 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45  xpr(), heightOfE
5160: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64  xprList().** and
5170: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5180: 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  ), are used to d
5190: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
51a0: 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f  imum height.** o
51b0: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
51c0: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
51d0: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
51e0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
51f0: 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
5200: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
5210: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
5220: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
5230: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
5240: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
5250: 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65  by pnHeight, the
5260: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
5270: 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48  r, then set *pnH
5280: 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a  eight to that.**
5290: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
52a0: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
52b0: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
52c0: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
52d0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
52e0: 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65  p->nHeight>*pnHe
52f0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  ight ){.      *p
5300: 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65  nHeight = p->nHe
5310: 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
5320: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
5330: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45  ightOfExprList(E
5340: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
5350: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
5360: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
5370: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5380: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  <p->nExpr; i++){
5390: 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45  .      heightOfE
53a0: 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70  xpr(p->a[i].pExp
53b0: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
53c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
53d0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65   void heightOfSe
53e0: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
53f0: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
5400: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68    if( p ){.    h
5410: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5420: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
5430: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5440: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
5450: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5460: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5470: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
5480: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5490: 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e  r(p->pOffset, pn
54a0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
54b0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
54c0: 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68  >pEList, pnHeigh
54d0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
54e0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
54f0: 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  upBy, pnHeight);
5500: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5510: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
5520: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
5530: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
5540: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65  (p->pPrior, pnHe
5550: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
5560: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
5570: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
5580: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
5590: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
55a0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
55b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
55c0: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
55d0: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
55e0: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
55f0: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
5600: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
5610: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
5620: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
5630: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
5640: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
5650: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
5660: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
5670: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72  e..**.** Also pr
5680: 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61  opagate EP_Propa
5690: 67 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72  gate flags up fr
56a0: 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  om Expr.x.pList 
56b0: 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a  to Expr.flags,.*
56c0: 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65  * if appropriate
56d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
56e0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45   exprSetHeight(E
56f0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  xpr *p){.  int n
5700: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
5710: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5720: 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  eft, &nHeight);.
5730: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5740: 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67  ->pRight, &nHeig
5750: 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ht);.  if( ExprH
5760: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5770: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
5780: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
5790: 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  t(p->x.pSelect, 
57a0: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c  &nHeight);.  }el
57b0: 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73  se if( p->x.pLis
57c0: 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  t ){.    heightO
57d0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70  fExprList(p->x.p
57e0: 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  List, &nHeight);
57f0: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
5800: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
5810: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
5820: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
5830: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67  ;.  }.  p->nHeig
5840: 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31  ht = nHeight + 1
5850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
5860: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
5870: 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74  variable using t
5880: 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  he exprSetHeight
5890: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a  () function. If.
58a0: 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73  ** the height is
58b0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
58c0: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
58d0: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  d expression dep
58e0: 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  th,.** leave an 
58f0: 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
5900: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
5910: 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f  agate all EP_Pro
5920: 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f  pagate flags fro
5930: 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69  m the Expr.x.pLi
5940: 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e  st into.** Expr.
5950: 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20  flags. .*/.void 
5960: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
5970: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72  ightAndFlags(Par
5980: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
5990: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72   *p){.  if( pPar
59a0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
59b0: 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67  n;.  exprSetHeig
59c0: 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ht(p);.  sqlite3
59d0: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
59e0: 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67  pParse, p->nHeig
59f0: 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ht);.}../*.** Re
5a00: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
5a10: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65   height of any e
5a20: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
5a30: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20  eferenced.** by 
5a40: 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  the select state
5a50: 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61  ment passed as a
5a60: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  n argument..*/.i
5a70: 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
5a80: 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63  ExprHeight(Selec
5a90: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  t *p){.  int nHe
5aa0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5ab0: 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e  htOfSelect(p, &n
5ac0: 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72  Height);.  retur
5ad0: 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c  n nHeight;.}.#el
5ae0: 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65  se /* ABOVE:  He
5af0: 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  ight enforcement
5b00: 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57   enabled.  BELOW
5b10: 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65  : Height enforce
5b20: 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a  ment off */./*.*
5b30: 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20  * Propagate all 
5b40: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
5b50: 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  gs from the Expr
5b60: 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a  .x.pList into.**
5b70: 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f   Expr.flags. .*/
5b80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
5b90: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
5ba0: 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
5bb0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
5bc0: 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73  ( p && p->x.pLis
5bd0: 74 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  t && !ExprHasPro
5be0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
5bf0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d  elect) ){.    p-
5c00: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f  >flags |= EP_Pro
5c10: 70 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33  pagate & sqlite3
5c20: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d  ExprListFlags(p-
5c30: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  >x.pList);.  }.}
5c40: 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74  .#define exprSet
5c50: 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66  Height(y).#endif
5c60: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45   /* SQLITE_MAX_E
5c70: 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a  XPR_DEPTH>0 */..
5c80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5c90: 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61  ne is the core a
5ca0: 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70  llocator for Exp
5cb0: 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43  r nodes..**.** C
5cc0: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
5cd0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
5ce0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
5cf0: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
5d00: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
5d10: 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20  ode and for the 
5d20: 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20  pToken argument 
5d30: 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  is a single allo
5d40: 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e  cation.** obtain
5d50: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
5d60: 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  bMalloc().  The 
5d70: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
5d80: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
5d90: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
5da0: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
5db0: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
5dc0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75  d..**.** If dequ
5dd0: 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ote is true, the
5de0: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20  n the token (if 
5df0: 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65  it exists) is de
5e00: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65  quoted..** If de
5e10: 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20  quote is false, 
5e20: 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20  no dequoting is 
5e30: 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20  performed.  The 
5e40: 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d  deQuote.** param
5e50: 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
5e60: 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
5e70: 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65  L or if the toke
5e80: 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70  n does not.** ap
5e90: 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65  pear to be quote
5ea0: 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65  d.  If the quote
5eb0: 73 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f  s were of the fo
5ec0: 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65  rm "..." (double
5ed0: 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e  -quotes).** then
5ee0: 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65   the EP_DblQuote
5ef0: 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  d flag is set on
5f00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5f10: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63  node..**.** Spec
5f20: 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70  ial case:  If op
5f30: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64  ==TK_INTEGER and
5f40: 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74   pToken points t
5f50: 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a  o a string that.
5f60: 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c  ** can be transl
5f70: 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62  ated into a 32-b
5f80: 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  it integer, then
5f90: 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f   the token is no
5fa0: 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75  t.** stored in u
5fb0: 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61  .zToken.  Instea
5fc0: 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  d, the integer v
5fd0: 61 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e  alues is written
5fe0: 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75  .** into u.iValu
5ff0: 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74  e and the EP_Int
6000: 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65  Value flag is se
6010: 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f  t.  No extra sto
6020: 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63  rage.** is alloc
6030: 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
6040: 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e   integer text an
6050: 64 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c  d the dequote fl
6060: 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ag is ignored..*
6070: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
6080: 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69  xprAlloc(.  sqli
6090: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
60a0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
60b0: 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  r sqlite3DbMallo
60c0: 63 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e  cRawNN() */.  in
60d0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
60e0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
60f0: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6100: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
6110: 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  ken,    /* Token
6120: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
6130: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  t be NULL */.  i
6140: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
6150: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
6160: 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a  o dequote */.){.
6170: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
6180: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
6190: 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30    int iValue = 0
61a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
61b0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  =0 );.  if( pTok
61c0: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70  en ){.    if( op
61d0: 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20  !=TK_INTEGER || 
61e0: 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20  pToken->z==0.   
61f0: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
6200: 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e  3GetInt32(pToken
6210: 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30  ->z, &iValue)==0
6220: 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
6230: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a   = pToken->n+1;.
6240: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56        assert( iV
6250: 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d  alue>=0 );.    }
6260: 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71  .  }.  pNew = sq
6270: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
6280: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  NN(db, sizeof(Ex
6290: 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69  pr)+nExtra);.  i
62a0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d  f( pNew ){.    m
62b0: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
62c0: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
62d0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38    pNew->op = (u8
62e0: 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  )op;.    pNew->i
62f0: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  Agg = -1;.    if
6300: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
6310: 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20    if( nExtra==0 
6320: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
6330: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
6340: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
6350: 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
6360: 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65  iValue;.      }e
6370: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
6380: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
6390: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
63a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
63b0: 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70  Token->z!=0 || p
63c0: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20  Token->n==0 );. 
63d0: 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65         if( pToke
63e0: 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e  n->n ) memcpy(pN
63f0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54  ew->u.zToken, pT
6400: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
6410: 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  >n);.        pNe
6420: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b  w->u.zToken[pTok
6430: 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  en->n] = 0;.    
6440: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
6450: 26 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74  && sqlite3Isquot
6460: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
6470: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
6480: 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54    if( pNew->u.zT
6490: 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70  oken[0]=='"' ) p
64a0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
64b0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
64c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
64d0: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
64e0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ken);.        }.
64f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
6500: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
6510: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
6520: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
6530: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
6540: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
6550: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
6560: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
6570: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
6580: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
6590: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
65a0: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
65b0: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
65c0: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
65d0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
65e0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
65f0: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6600: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6610: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
6620: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6630: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6640: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6650: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
6660: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
6670: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
6680: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
6690: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
66a0: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
66b0: 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65   zToken ? sqlite
66c0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
66d0: 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
66e0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
66f0: 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b  (db, op, &x, 0);
6700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
6710: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
6720: 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68  and pRight to th
6730: 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f  e Expr node pRoo
6740: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f  t..**.** If pRoo
6750: 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  t==NULL that mea
6760: 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  ns that a memory
6770: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
6780: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
6790: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
67a0: 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74   delete the subt
67b0: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
67c0: 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Right..*/.void s
67d0: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
67e0: 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69  Subtrees(.  sqli
67f0: 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20  te3 *db,.  Expr 
6800: 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a  *pRoot,.  Expr *
6810: 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70  pLeft,.  Expr *p
6820: 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70  Right.){.  if( p
6830: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Root==0 ){.    a
6840: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
6850: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
6860: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6870: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
6880: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6890: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
68a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
68b0: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
68c0: 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d   pRoot->pRight =
68d0: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70   pRight;.      p
68e0: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
68f0: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 52  P_Propagate & pR
6900: 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ight->flags;.   
6910: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
6920: 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d   ){.      pRoot-
6930: 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a  >pLeft = pLeft;.
6940: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
6950: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
6960: 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67  te & pLeft->flag
6970: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70  s;.    }.    exp
6980: 72 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74  rSetHeight(pRoot
6990: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
69a0: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72  Allocate an Expr
69b0: 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e   node which join
69c0: 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f  s as many as two
69d0: 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a   subtrees..**.**
69e0: 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20   One or both of 
69f0: 74 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e  the subtrees can
6a00: 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72   be NULL.  Retur
6a10: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
6a20: 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e  he new.** Expr n
6a30: 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20  ode.  Or, if an 
6a40: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
6a50: 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62  , set pParse->db
6a60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a  ->mallocFailed,.
6a70: 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74  ** free the subt
6a80: 72 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20  rees and return 
6a90: 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  NULL..*/.Expr *s
6aa0: 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50  qlite3PExpr(.  P
6ab0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6ac0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
6ad0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
6ae0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
6af0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
6b00: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
6b10: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
6b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
6b30: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
6b40: 70 72 20 2a 70 52 69 67 68 74 20 20 20 20 20 20  pr *pRight      
6b50: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f        /* Right o
6b60: 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45  perand */.){.  E
6b70: 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70  xpr *p;.  if( op
6b80: 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50 61 72  ==TK_AND && pPar
6b90: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
6ba0: 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e     /* Take advan
6bb0: 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69  tage of short-ci
6bc0: 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69  rcuit false opti
6bd0: 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44  mization for AND
6be0: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   */.    p = sqli
6bf0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
6c00: 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52  e->db, pLeft, pR
6c10: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
6c20: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44      p = sqlite3D
6c30: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61  bMallocRawNN(pPa
6c40: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
6c50: 45 78 70 72 29 29 3b 0a 20 20 20 20 69 66 28 20  Expr));.    if( 
6c60: 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  p ){.      memse
6c70: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  t(p, 0, sizeof(E
6c80: 78 70 72 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e  xpr));.      p->
6c90: 6f 70 20 3d 20 6f 70 20 26 20 54 4b 46 4c 47 5f  op = op & TKFLG_
6ca0: 4d 41 53 4b 3b 0a 20 20 20 20 20 20 70 2d 3e 69  MASK;.      p->i
6cb0: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Agg = -1;.    }.
6cc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
6cd0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50  ttachSubtrees(pP
6ce0: 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65  arse->db, p, pLe
6cf0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  ft, pRight);.  }
6d00: 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20  .  if( p ) {.   
6d10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
6d20: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
6d30: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
6d40: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
6d50: 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63  /*.** Add pSelec
6d60: 74 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e  t to the Expr.x.
6d70: 70 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20  pSelect field.  
6d80: 4f 72 2c 20 69 66 20 70 45 78 70 72 20 69 73 20  Or, if pExpr is 
6d90: 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20  NULL (due.** do 
6da0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
6db0: 69 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65  ion failure) the
6dc0: 6e 20 64 65 6c 65 74 65 20 74 68 65 20 70 53 65  n delete the pSe
6dd0: 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  lect object..*/.
6de0: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78 70  void sqlite3PExp
6df0: 72 41 64 64 53 65 6c 65 63 74 28 50 61 72 73 65  rAddSelect(Parse
6e00: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
6e10: 70 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70  pExpr, Select *p
6e20: 53 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70  Select){.  if( p
6e30: 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70  Expr ){.    pExp
6e40: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70  r->x.pSelect = p
6e50: 53 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72  Select;.    Expr
6e60: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
6e70: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c  r, EP_xIsSelect|
6e80: 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20  EP_Subquery);.  
6e90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74    sqlite3ExprSet
6ea0: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70  HeightAndFlags(p
6eb0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
6ec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6ed0: 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
6ee0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
6ef0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
6f00: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
6f10: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
6f20: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  }.}.../*.** If t
6f30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
6f40: 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 54   always either T
6f50: 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72 65  RUE or FALSE (re
6f60: 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20  spectively),.** 
6f70: 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20 20  then return 1.  
6f80: 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65  If one cannot de
6f90: 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75 74  termine the trut
6fa0: 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a  h value of the.*
6fb0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20  * expression at 
6fc0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65 74  compile-time ret
6fd0: 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urn 0..**.** Thi
6fe0: 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
6ff0: 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20  tion.  If is OK 
7000: 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72 65  to return 0 here
7010: 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20   even if.** the 
7020: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c  expression reall
7030: 79 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73  y is always fals
7040: 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66 61  e or false (a fa
7050: 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a  lse negative)..*
7060: 2a 20 42 75 74 20 69 74 20 69 73 20 61 20 62 75  * But it is a bu
7070: 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66  g to return 1 if
7080: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7090: 6d 69 67 68 74 20 68 61 76 65 20 64 69 66 66 65  might have diffe
70a0: 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20  rent.** boolean 
70b0: 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65 72  values in differ
70c0: 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63 65  ent circumstance
70d0: 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74  s (a false posit
70e0: 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ive.).**.** Note
70f0: 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78 70   that if the exp
7100: 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20  ression is part 
7110: 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66  of conditional f
7120: 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49  or a.** LEFT JOI
7130: 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f  N, then we canno
7140: 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63  t determine at c
7150: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74  ompile-time whet
7160: 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73  her or not.** is
7170: 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73   it true or fals
7180: 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74  e, so always ret
7190: 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
71a0: 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 54   int exprAlwaysT
71b0: 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  rue(Expr *p){.  
71c0: 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28  int v = 0;.  if(
71d0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
71e0: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
71f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
7200: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
7210: 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20  sInteger(p, &v) 
7220: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
7230: 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61  turn v!=0;.}.sta
7240: 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61  tic int exprAlwa
7250: 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29  ysFalse(Expr *p)
7260: 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20  {.  int v = 0;. 
7270: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
7280: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
7290: 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
72a0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
72b0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20  xprIsInteger(p, 
72c0: 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  &v) ) return 0;.
72d0: 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d    return v==0;.}
72e0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f  ../*.** Join two
72f0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69   expressions usi
7300: 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ng an AND operat
7310: 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65  or.  If either e
7320: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
7330: 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20  NULL, then just 
7340: 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72  return the other
7350: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
7360: 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f  ** If one side o
7370: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
7380: 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20  he AND is known 
7390: 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65  to be false, the
73a0: 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20  n instead.** of 
73b0: 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44  returning an AND
73c0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73   expression, jus
73d0: 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74  t return a const
73e0: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ant expression w
73f0: 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f  ith.** a value o
7400: 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72  f false..*/.Expr
7410: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64   *sqlite3ExprAnd
7420: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
7430: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
7440: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20  *pRight){.  if( 
7450: 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeft==0 ){.    
7460: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
7470: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
7480: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
7490: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
74a0: 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
74b0: 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20  False(pLeft) || 
74c0: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
74d0: 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73  pRight) ){.    s
74e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
74f0: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
7500: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7510: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
7520: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
7530: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
7540: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
7550: 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d  ite3IntTokens[0]
7560: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
7570: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
7580: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
7590: 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20  (db, TK_AND, 0, 
75a0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  0);.    sqlite3E
75b0: 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65  xprAttachSubtree
75c0: 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66  s(db, pNew, pLef
75d0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
75e0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d  return pNew;.  }
75f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
7600: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
7610: 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20  sion node for a 
7620: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75  function with mu
7630: 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65  ltiple.** argume
7640: 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  nts..*/.Expr *sq
7650: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f  lite3ExprFunctio
7660: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
7670: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
7680: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
7690: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
76a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
76b0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
76c0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a  sert( pToken );.
76d0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
76e0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
76f0: 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65  _FUNCTION, pToke
7700: 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65  n, 1);.  if( pNe
7710: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
7720: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
7730: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a  e(db, pList); /*
7740: 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65   Avoid memory le
7750: 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66  ak when malloc f
7760: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ails */.    retu
7770: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  rn 0;.  }.  pNew
7780: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ->x.pList = pLis
7790: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  t;.  assert( !Ex
77a0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
77b0: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
77c0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ) );.  sqlite3Ex
77d0: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
77e0: 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ags(pParse, pNew
77f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
7800: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
7810: 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  n a variable num
7820: 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73  ber to an expres
7830: 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65  sion that encode
7840: 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20  s a wildcard.** 
7850: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
7860: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
7870: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
7880: 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
7890: 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20   single "?" are 
78a0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78  assigned the nex
78b0: 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20  t sequential.** 
78c0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e  variable number.
78d0: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
78e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
78f0: 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  nn" are assigned
7900: 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e   the number "nnn
7910: 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73  ".  We make.** s
7920: 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74  ure "nnn" is not
7930: 20 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69   too big to avoi
7940: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
7950: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
7960: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
7970: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
7980: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
7990: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
79a0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
79b0: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
79c0: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
79d0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
79e0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
79f0: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
7a00: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
7a10: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
7a20: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
7a30: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
7a40: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
7a50: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
7a60: 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75  tial variable nu
7a70: 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67  mber is.** assig
7a80: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
7a90: 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61  ite3ExprAssignVa
7aa0: 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70  rNumber(Parse *p
7ab0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7ac0: 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71  pr, u32 n){.  sq
7ad0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7ae0: 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20  se->db;.  const 
7af0: 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72  char *z;.  ynVar
7b00: 20 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72   x;..  if( pExpr
7b10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7b20: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
7b30: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
7b40: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
7b50: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
7b60: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
7b70: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
7b80: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
7b90: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
7ba0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7bb0: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
7bc0: 33 30 28 7a 29 20 29 3b 0a 20 20 69 66 28 20 7a  30(z) );.  if( z
7bd0: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
7be0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
7bf0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
7c00: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
7c10: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
7c20: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
7c30: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 78 20 3d 20  ='?' );.    x = 
7c40: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
7c50: 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65  ->nVar);.  }else
7c60: 7b 0a 20 20 20 20 69 6e 74 20 64 6f 41 64 64 20  {.    int doAdd 
7c70: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  = 0;.    if( z[0
7c80: 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='?' ){.      
7c90: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
7ca0: 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20  he form "?nnn". 
7cb0: 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74   Convert "nnn" t
7cc0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64  o an integer and
7cd0: 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74  .      ** use it
7ce0: 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c 65   as the variable
7cf0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20   number */.     
7d00: 20 69 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e   i64 i;.      in
7d10: 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74  t bOk = 0==sqlit
7d20: 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20  e3Atoi64(&z[1], 
7d30: 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f  &i, n-1, SQLITE_
7d40: 55 54 46 38 29 3b 0a 20 20 20 20 20 20 78 20 3d  UTF8);.      x =
7d50: 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20   (ynVar)i;.     
7d60: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20   testcase( i==0 
7d70: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7d80: 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20  e( i==1 );.     
7d90: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
7da0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7db0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
7dc0: 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20  UMBER]-1 );.    
7dd0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
7de0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
7df0: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
7e00: 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20  NUMBER] );.     
7e10: 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69   if( bOk==0 || i
7e20: 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d  <1 || i>db->aLim
7e30: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7e40: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
7e50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7e60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7e70: 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75  se, "variable nu
7e80: 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74  mber must be bet
7e90: 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22  ween ?1 and ?%d"
7ea0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  ,.            db
7eb0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7ec0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
7ed0: 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20  UMBER]);.       
7ee0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
7ef0: 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50 61  .      if( x>pPa
7f00: 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20  rse->nVar ){.   
7f10: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
7f20: 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20 20 20 20  r = (int)x;.    
7f30: 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20      doAdd = 1;. 
7f40: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
7f50: 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f  qlite3VListNumTo
7f60: 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c  Name(pParse->pVL
7f70: 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20  ist, x)==0 ){.  
7f80: 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b        doAdd = 1;
7f90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7fa0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c  se{.      /* Wil
7fb0: 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61  dcards like ":aa
7fc0: 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40  a", "$aaa" or "@
7fd0: 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65  aaa".  Reuse the
7fe0: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20   same variable. 
7ff0: 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61       ** number a
8000: 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65  s the prior appe
8010: 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  arance of the sa
8020: 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74  me name, or if t
8030: 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  he name.      **
8040: 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61   has never appea
8050: 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73  red before, reus
8060: 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61  e the same varia
8070: 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  ble number.     
8080: 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 28 79   */.      x = (y
8090: 6e 56 61 72 29 73 71 6c 69 74 65 33 56 4c 69 73  nVar)sqlite3VLis
80a0: 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73  tNameToNum(pPars
80b0: 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29  e->pVList, z, n)
80c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30  ;.      if( x==0
80d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20   ){.        x = 
80e0: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
80f0: 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20 20 20  ->nVar);.       
8100: 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20   doAdd = 1;.    
8110: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
8120: 28 20 64 6f 41 64 64 20 29 7b 0a 20 20 20 20 20  ( doAdd ){.     
8130: 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20   pParse->pVList 
8140: 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74 41 64  = sqlite3VListAd
8150: 64 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 56  d(db, pParse->pV
8160: 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a  List, z, n, x);.
8170: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70      }.  }.  pExp
8180: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a  r->iColumn = x;.
8190: 20 20 69 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d    if( x>db->aLim
81a0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
81b0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
81c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
81d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
81e0: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
81f0: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
8200: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
8210: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
8220: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
8230: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
8240: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71  NOINLINE void sq
8250: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8260: 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  N(sqlite3 *db, E
8270: 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  xpr *p){.  asser
8280: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20  t( p!=0 );.  /* 
8290: 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73  Sanity check: As
82a0: 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49 6e  sert that the In
82b0: 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65  tValue is non-ne
82c0: 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78 69  gative if it exi
82d0: 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sts */.  assert(
82e0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
82f0: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
8300: 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65  ) || p->u.iValue
8310: 3e 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51  >=0 );.#ifdef SQ
8320: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
8330: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8340: 28 70 2c 20 45 50 5f 4c 65 61 66 29 20 26 26 20  (p, EP_Leaf) && 
8350: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8360: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
8370: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
8380: 20 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a   p->pLeft==0 );.
8390: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
83a0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
83b0: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 53 65  assert( p->x.pSe
83c0: 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  lect==0 );.  }.#
83d0: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 45 78 70  endif.  if( !Exp
83e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
83f0: 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  (EP_TokenOnly|EP
8400: 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 2f  _Leaf)) ){.    /
8410: 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69  * The Expr.x uni
8420: 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  on is never used
8430: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
8440: 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74  e as Expr.pRight
8450: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
8460: 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  p->x.pList==0 ||
8470: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
8480: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66  .    if( p->pLef
8490: 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53  t && p->op!=TK_S
84a0: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73  ELECT_COLUMN ) s
84b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
84c0: 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29  NN(db, p->pLeft)
84d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
84e0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
84f0: 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20  Right);.    if( 
8500: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8510: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
8520: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8530: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
8540: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  , p->x.pSelect);
8550: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8560: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8570: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
8580: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
8590: 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
85a0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
85b0: 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74  emToken) ) sqlit
85c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
85d0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  u.zToken);.  if(
85e0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
85f0: 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20  y(p, EP_Static) 
8600: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
8610: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  Free(db, p);.  }
8620: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
8630: 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65  xprDelete(sqlite
8640: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
8650: 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c 69 74  .  if( p ) sqlit
8660: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64  e3ExprDeleteNN(d
8670: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
8680: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
8690: 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63  r of bytes alloc
86a0: 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70  ated for the exp
86b0: 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72  ression structur
86c0: 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  e .** passed as 
86d0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
86e0: 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  nt. This is alwa
86f0: 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46  ys one of EXPR_F
8700: 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52  ULLSIZE,.** EXPR
8710: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20  _REDUCEDSIZE or 
8720: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
8730: 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ZE..*/.static in
8740: 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  t exprStructSize
8750: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
8760: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8770: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
8780: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
8790: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20  TOKENONLYSIZE;. 
87a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
87b0: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
87c0: 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ed) ) return EXP
87d0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20  R_REDUCEDSIZE;. 
87e0: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c   return EXPR_FUL
87f0: 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSIZE;.}../*.** 
8800: 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53 69  The dupedExpr*Si
8810: 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61  ze() routines ea
8820: 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ch return the nu
8830: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
8840: 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f  quired.** to sto
8850: 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  re a copy of an 
8860: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78  expression or ex
8870: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
8880: 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a  They differ in.*
8890: 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68  * how much of th
88a0: 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75 72  e tree is measur
88b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75  ed..**.**     du
88c0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
88d0: 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20  e()     Size of 
88e0: 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73 74  only the Expr st
88f0: 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20  ructure .**     
8900: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
8910: 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f  e()       Size o
8920: 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20 66  f Expr + space f
8930: 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20  or token.**     
8940: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29 20  dupedExprSize() 
8950: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2b            Expr +
8960: 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65   token + subtree
8970: 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a   components.**.*
8980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
89a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
89b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
89c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
89d0: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53 74   The dupedExprSt
89e0: 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74  ructSize() funct
89f0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20  ion returns two 
8a00: 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67  values OR-ed tog
8a10: 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20  ether:  .** (1) 
8a20: 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72  the space requir
8a30: 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66  ed for a copy of
8a40: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
8a50: 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a  ure only and .**
8a60: 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78 20   (2) the EP_xxx 
8a70: 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63  flags that indic
8a80: 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74 72  ate what the str
8a90: 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75  ucture size shou
8aa0: 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65  ld be..** The re
8ab0: 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61  turn values is a
8ac0: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  lways one of:.**
8ad0: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55  .**      EXPR_FU
8ae0: 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45  LLSIZE.**      E
8af0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
8b00: 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a    | EP_Reduced.*
8b10: 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45  *      EXPR_TOKE
8b20: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
8b30: 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54  okenOnly.**.** T
8b40: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73  he size of the s
8b50: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
8b60: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
8b70: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
8b80: 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75  e.** of this rou
8b90: 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e  tine with 0xfff.
8ba0: 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20    The flags can 
8bb0: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
8bc0: 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  ing the.** retur
8bd0: 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f  n value with EP_
8be0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
8bf0: 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  Only..**.** Note
8c00: 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67 73   that with flags
8c10: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
8c20: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20  , this routines 
8c30: 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69  works on full-si
8c40: 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64  ze.** (unreduced
8c50: 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61  ) Expr objects a
8c60: 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e  s they or origin
8c70: 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64  ally constructed
8c80: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a   by the parser..
8c90: 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65 73  ** During expres
8ca0: 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65  sion analysis, e
8cb0: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
8cc0: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
8cd0: 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c   moved into.** l
8ce0: 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74 65  ater parts of te
8cf0: 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  h Expr object an
8d00: 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66  d that extra inf
8d10: 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67  ormation might g
8d20: 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66  et chopped.** of
8d30: 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  f if the express
8d40: 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20  ion is reduced. 
8d50: 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
8d60: 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  it does not work
8d70: 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45   to.** make an E
8d80: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f  XPRDUP_REDUCE co
8d90: 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20  py of a reduced 
8da0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20  expression.  It 
8db0: 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a  is only legal.**
8dc0: 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69   to reduce a pri
8dd0: 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  stine expression
8de0: 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70   tree from the p
8df0: 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c  arser.  The impl
8e00: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ementation.** of
8e10: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8e20: 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d  Size() contain m
8e30: 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29  ultiple assert()
8e40: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
8e50: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
8e60: 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73  nforce this cons
8e70: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  traint..*/.stati
8e80: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
8e90: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
8ea0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
8eb0: 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73   int nSize;.  as
8ec0: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50  sert( flags==EXP
8ed0: 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66  RDUP_REDUCE || f
8ee0: 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e  lags==0 ); /* On
8ef0: 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75  ly one flag valu
8f00: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61  e allowed */.  a
8f10: 73 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c  ssert( EXPR_FULL
8f20: 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20  SIZE<=0xfff );. 
8f30: 20 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20   assert( (0xfff 
8f40: 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50  & (EP_Reduced|EP
8f50: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20  _TokenOnly))==0 
8f60: 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67  );.  if( 0==flag
8f70: 73 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  s ){.    nSize =
8f80: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
8f90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
8fa0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
8fb0: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
8fc0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
8fd0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
8fe0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
8ff0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
9000: 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74  ) ); .    assert
9010: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9020: 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65  ty(p, EP_MemToke
9030: 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
9040: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9050: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
9060: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  e) );.    if( p-
9070: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70  >pLeft || p->x.p
9080: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
9090: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
90a0: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
90b0: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
90c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
90d0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
90e0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
90f0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
9100: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20   EP_TokenOnly;. 
9110: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9120: 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nSize;.}../*.*
9130: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9140: 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63  returns the spac
9150: 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69  e in bytes requi
9160: 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  red to store the
9170: 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65   copy .** of the
9180: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
9190: 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  and a copy of th
91a0: 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  e Expr.u.zToken 
91b0: 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a  string (if that.
91c0: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66  ** string is def
91d0: 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ined.).*/.static
91e0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f   int dupedExprNo
91f0: 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  deSize(Expr *p, 
9200: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
9210: 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45  t nByte = dupedE
9220: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
9230: 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b   flags) & 0xfff;
9240: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
9250: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
9260: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
9270: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42  zToken ){.    nB
9280: 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
9290: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
92a0: 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74  en)+1;.  }.  ret
92b0: 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  urn ROUND8(nByte
92c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
92d0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
92e0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
92f0: 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c  to create a dupl
9300: 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a  icate of the .**
9310: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
9320: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
9330: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65  argument. The se
9340: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
9350: 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61   a.** mask conta
9360: 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58  ining EXPRDUP_XX
9370: 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  X flags..**.** T
9380: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
9390: 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65  d includes space
93a0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70   to create a cop
93b0: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
93c0: 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61  ruct.** itself a
93d0: 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65  nd the buffer re
93e0: 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70  ferred to by Exp
93f0: 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61  r.u.zToken, if a
9400: 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ny..**.** If the
9410: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
9420: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
9430: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
9440: 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20  ue includes .** 
9450: 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61  space to duplica
9460: 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65  te all Expr node
9470: 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f  s in the tree fo
9480: 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65  rmed by Expr.pLe
9490: 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e  ft .** and Expr.
94a0: 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73  pRight variables
94b0: 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e   (but not for an
94c0: 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69  y structures poi
94d0: 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64  nted to or .** d
94e0: 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68  escended from th
94f0: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f  e Expr.x.pList o
9500: 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  r Expr.x.pSelect
9510: 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a   variables)..*/.
9520: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
9530: 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ExprSize(Expr *p
9540: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
9550: 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  int nByte = 0;. 
9560: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42   if( p ){.    nB
9570: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e  yte = dupedExprN
9580: 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  odeSize(p, flags
9590: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
95a0: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  &EXPRDUP_REDUCE 
95b0: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
95c0: 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  = dupedExprSize(
95d0: 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29  p->pLeft, flags)
95e0: 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65   + dupedExprSize
95f0: 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67  (p->pRight, flag
9600: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  s);.    }.  }.  
9610: 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a  return nByte;.}.
9620: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
9630: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
9640: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  to sqlite3ExprDu
9650: 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  p(), except that
9660: 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a   if pzBuffer .**
9670: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
9680: 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61  n *pzBuffer is a
9690: 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20  ssumed to point 
96a0: 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67  to a buffer larg
96b0: 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20  e enough .** to 
96c0: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  store the copy o
96d0: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20  f expression p, 
96e0: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d  the copies of p-
96f0: 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66  >u.zToken.** (if
9700: 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e   applicable), an
9710: 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  d the copies of 
9720: 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64  the p->pLeft and
9730: 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65   p->pRight expre
9740: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e  ssions,.** if an
9750: 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  y. Before return
9760: 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69  ing, *pzBuffer i
9770: 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  s set to the fir
9780: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
9790: 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  .** portion of t
97a0: 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64  he buffer copied
97b0: 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75   into by this fu
97c0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
97d0: 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28  c Expr *exprDup(
97e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
97f0: 72 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61  r *p, int dupFla
9800: 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65  gs, u8 **pzBuffe
9810: 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  r){.  Expr *pNew
9820: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
9830: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
9840: 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20  /.  u8 *zAlloc; 
9850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
9860: 6f 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77  ory space from w
9870: 68 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78  hich to build Ex
9880: 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  pr object */.  u
9890: 33 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20  32 staticFlag;  
98a0: 20 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69       /* EP_Stati
98b0: 63 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f  c if space not o
98c0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
98d0: 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  loc */..  assert
98e0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
98f0: 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65  ert( p );.  asse
9900: 72 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20  rt( dupFlags==0 
9910: 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50  || dupFlags==EXP
9920: 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20  RDUP_REDUCE );. 
9930: 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65   assert( pzBuffe
9940: 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73  r==0 || dupFlags
9950: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
9960: 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   );..  /* Figure
9970: 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72   out where to wr
9980: 69 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72  ite the new Expr
9990: 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
99a0: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
99b0: 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70  .    zAlloc = *p
99c0: 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61  zBuffer;.    sta
99d0: 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61  ticFlag = EP_Sta
99e0: 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tic;.  }else{.  
99f0: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
9a00: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
9a10: 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a  db, dupedExprSiz
9a20: 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b  e(p, dupFlags));
9a30: 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20  .    staticFlag 
9a40: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20  = 0;.  }.  pNew 
9a50: 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63  = (Expr *)zAlloc
9a60: 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  ;..  if( pNew ){
9a70: 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77  .    /* Set nNew
9a80: 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
9a90: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
9aa0: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
9ab0: 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  nted to.    ** b
9ac0: 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20  y pNew. This is 
9ad0: 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c  either EXPR_FULL
9ae0: 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43  SIZE, EXPR_REDUC
9af0: 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a  EDSIZE or.    **
9b00: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
9b10: 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73  IZE. nToken is s
9b20: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
9b30: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
9b40: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
9b50: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e   copy of the p->
9b60: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
9b70: 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
9b80: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
9b90: 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20  ned nStructSize 
9ba0: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
9bb0: 74 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67  tSize(p, dupFlag
9bc0: 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  s);.    const in
9bd0: 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74  t nNewSize = nSt
9be0: 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66  ructSize & 0xfff
9bf0: 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e  ;.    int nToken
9c00: 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48  ;.    if( !ExprH
9c10: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9c20: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
9c30: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
9c40: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69     nToken = sqli
9c50: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
9c60: 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20  .zToken) + 1;.  
9c70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
9c80: 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  Token = 0;.    }
9c90: 0a 20 20 20 20 69 66 28 20 64 75 70 46 6c 61 67  .    if( dupFlag
9ca0: 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  s ){.      asser
9cb0: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
9cc0: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
9cd0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65  )==0 );.      me
9ce0: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
9cf0: 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d  nNewSize);.    }
9d00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
9d10: 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70  nSize = (u32)exp
9d20: 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a  rStructSize(p);.
9d30: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
9d40: 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a  loc, p, nSize);.
9d50: 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c        if( nSize<
9d60: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b  EXPR_FULLSIZE ){
9d70: 20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74   .        memset
9d80: 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c  (&zAlloc[nSize],
9d90: 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   0, EXPR_FULLSIZ
9da0: 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  E-nSize);.      
9db0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
9dc0: 53 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63  Set the EP_Reduc
9dd0: 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ed, EP_TokenOnly
9de0: 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20  , and EP_Static 
9df0: 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74  flags appropriat
9e00: 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77  ely. */.    pNew
9e10: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f  ->flags &= ~(EP_
9e20: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
9e30: 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45  Only|EP_Static|E
9e40: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20  P_MemToken);.   
9e50: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
9e60: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45  nStructSize & (E
9e70: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
9e80: 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65  enOnly);.    pNe
9e90: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74  w->flags |= stat
9ea0: 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20  icFlag;..    /* 
9eb0: 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54  Copy the p->u.zT
9ec0: 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20  oken string, if 
9ed0: 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
9ee0: 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  nToken ){.      
9ef0: 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70  char *zToken = p
9f00: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
9f10: 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e  (char*)&zAlloc[n
9f20: 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20  NewSize];.      
9f30: 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70  memcpy(zToken, p
9f40: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ->u.zToken, nTok
9f50: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  en);.    }..    
9f60: 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67  if( 0==((p->flag
9f70: 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26  s|pNew->flags) &
9f80: 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45   (EP_TokenOnly|E
9f90: 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20  P_Leaf)) ){.    
9fa0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
9fb0: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
9fc0: 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73   or pNew->x.pLis
9fd0: 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  t member. */.   
9fe0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
9ff0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
a000: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
a010: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65     pNew->x.pSele
a020: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
a030: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  ctDup(db, p->x.p
a040: 53 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73  Select, dupFlags
a050: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a060: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
a070: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
a080: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
a090: 2d 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c  ->x.pList, dupFl
a0a0: 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ags);.      }.  
a0b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c    }..    /* Fill
a0c0: 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20   in pNew->pLeft 
a0d0: 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  and pNew->pRight
a0e0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70  . */.    if( Exp
a0f0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
a100: 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  w, EP_Reduced|EP
a110: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
a120: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64       zAlloc += d
a130: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
a140: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  (p, dupFlags);. 
a150: 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
a160: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
a170: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a180: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20  Leaf) ){.       
a190: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
a1a0: 2d 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20  ->pLeft ?.      
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
a1d0: 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45  Left, EXPRDUP_RE
a1e0: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a  DUCE, &zAlloc) :
a1f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
a200: 2d 3e 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52  ->pRight = p->pR
a210: 69 67 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20  ight ?.         
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
a230: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69  prDup(db, p->pRi
a240: 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  ght, EXPRDUP_RED
a250: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20  UCE, &zAlloc) : 
a260: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
a270: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
a280: 0a 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66  .        *pzBuff
a290: 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20  er = zAlloc;.   
a2a0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
a2b0: 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48        if( !ExprH
a2c0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
a2d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65  _TokenOnly|EP_Le
a2e0: 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  af) ){.        i
a2f0: 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f  f( pNew->op==TK_
a300: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b  SELECT_COLUMN ){
a310: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
a320: 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66  >pLeft = p->pLef
a330: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
a340: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
a350: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
a360: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
a370: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
a380: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
a390: 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  w->pRight = sqli
a3a0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
a3b0: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
a3c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a3d0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
a3e0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
a3f0: 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65 70  nd return a deep
a400: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a   copy of the obj
a410: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
a420: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67  e second .** arg
a430: 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d  ument. If an OOM
a440: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e   condition is en
a450: 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20  countered, NULL 
a460: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
a470: 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  nd the db->mallo
a480: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  cFailed flag set
a490: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
a4a0: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61  ITE_OMIT_CTE.sta
a4b0: 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44 75  tic With *withDu
a4c0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  p(sqlite3 *db, W
a4d0: 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20  ith *p){.  With 
a4e0: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
a4f0: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42   p ){.    int nB
a500: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
a510: 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   + sizeof(p->a[0
a520: 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29  ]) * (p->nCte-1)
a530: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
a540: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
a550: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
a560: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
a570: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
a580: 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e  pRet->nCte = p->
a590: 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  nCte;.      for(
a5a0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20  i=0; i<p->nCte; 
a5b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 52  i++){.        pR
a5c0: 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  et->a[i].pSelect
a5d0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
a5e0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
a5f0: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
a600: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
a610: 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 45  pCols = sqlite3E
a620: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
a630: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29  ->a[i].pCols, 0)
a640: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
a650: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
a660: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
a670: 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b   p->a[i].zName);
a680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a690: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
a6a0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
a6b0: 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29 20  ne withDup(x,y) 
a6c0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
a6d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
a6e0: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
a6f0: 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73  make deep copies
a700: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   of expressions,
a710: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
a720: 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20  ists, ID lists, 
a730: 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  and select state
a740: 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69  ments.  The copi
a750: 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c  es can.** be del
a760: 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70  eted (by being p
a770: 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72  assed to their r
a780: 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c  espective ...Del
a790: 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a  ete() routines).
a7a0: 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ** without effec
a7b0: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
a7c0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  ls..**.** The ex
a7d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49  pression list, I
a7e0: 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69  D, and source li
a7f0: 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71  sts return by sq
a800: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a810: 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64  (),.** sqlite3Id
a820: 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73  ListDup(), and s
a830: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
a840: 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75  () can not be fu
a850: 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a  rther expanded .
a860: 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ** by subsequent
a870: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
a880: 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f  *ListAppend() ro
a890: 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  utines..**.** An
a8a0: 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68  y tables that th
a8b0: 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  e SrcList might 
a8c0: 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74  point to are not
a8d0: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a   duplicated..**.
a8e0: 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 72  ** The flags par
a8f0: 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  ameter contains 
a900: 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
a910: 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58 58   the EXPRDUP_XXX
a920: 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68   flags..** If th
a930: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
a940: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
a950: 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  en the structure
a960: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a   returned is a.*
a970: 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72 73  * truncated vers
a980: 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ion of the usual
a990: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
a9a0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f  that will be sto
a9b0: 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  red as.** part o
a9c0: 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
a9d0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
a9e0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
a9f0: 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a  chema..*/.Expr *
aa00: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73  sqlite3ExprDup(s
aa10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
aa20: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
aa30: 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
aa40: 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 45 58  ==0 || flags==EX
aa50: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a  PRDUP_REDUCE );.
aa60: 20 20 72 65 74 75 72 6e 20 70 20 3f 20 65 78 70    return p ? exp
aa70: 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67  rDup(db, p, flag
aa80: 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a 45 78 70  s, 0) : 0;.}.Exp
aa90: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
aaa0: 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  prListDup(sqlite
aab0: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
aac0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
aad0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
aae0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
aaf0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
ab00: 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e   *pOldItem;.  in
ab10: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64  t i;.  assert( d
ab20: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
ab30: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ab40: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
ab50: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
ab60: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
ab70: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
ab80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
ab90: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20  ew->nExpr = i = 
aba0: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  p->nExpr;.  if( 
abb0: 28 66 6c 61 67 73 20 26 20 45 58 50 52 44 55 50  (flags & EXPRDUP
abc0: 5f 52 45 44 55 43 45 29 3d 3d 30 20 29 20 66 6f  _REDUCE)==0 ) fo
abd0: 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=1; i<p->nExp
abe0: 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65  r; i+=i){}.  pNe
abf0: 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73  w->a = pItem = s
ac00: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
ac10: 77 4e 4e 28 64 62 2c 20 20 69 2a 73 69 7a 65 6f  wNN(db,  i*sizeo
ac20: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
ac30: 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a  if( pItem==0 ){.
ac40: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
ac50: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
ac60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a   return 0;.  } .
ac70: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
ac80: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
ac90: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
aca0: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
acb0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
acc0: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
acd0: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 70  em->pExpr;.    p
ace0: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Item->pExpr = sq
acf0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
ad00: 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73   pOldExpr, flags
ad10: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
ad20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
ad30: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
ad40: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
ad50: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
ad60: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ad70: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70  b, pOldItem->zSp
ad80: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
ad90: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
ada0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
adb0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
adc0: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d   = 0;.    pItem-
add0: 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f  >bSpanIsTab = pO
ade0: 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54  ldItem->bSpanIsT
adf0: 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75  ab;.    pItem->u
ae00: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a   = pOldItem->u;.
ae10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
ae20: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
ae30: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
ae40: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
ae50: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
ae60: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
ae70: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
ae80: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
ae90: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
aea0: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
aeb0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
aec0: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
aed0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
aee0: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
aef0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
af00: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
af10: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
af20: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
af30: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
af40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
af50: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
af60: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
af70: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
af80: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
af90: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
afa0: 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74   SrcList *p, int
afb0: 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69   flags){.  SrcLi
afc0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
afd0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
afe0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
aff0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
b000: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74  return 0;.  nByt
b010: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
b020: 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69   (p->nSrc>0 ? si
b030: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
b040: 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29  (p->nSrc-1) : 0)
b050: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
b060: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
b070: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
b080: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
b090: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
b0a0: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
b0b0: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
b0c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
b0d0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
b0e0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
b0f0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
b100: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
b110: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
b120: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
b130: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
b140: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
b150: 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20  ewItem->pSchema 
b160: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68  = pOldItem->pSch
b170: 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ema;.    pNewIte
b180: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
b190: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b1a0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
b1b0: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
b1c0: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
b1d0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b1e0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
b1f0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
b200: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
b210: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b220: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
b230: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b240: 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  >fg = pOldItem->
b250: 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  fg;.    pNewItem
b260: 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64  ->iCursor = pOld
b270: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
b280: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64     pNewItem->add
b290: 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49  rFillSub = pOldI
b2a0: 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
b2b0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b2c0: 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64  regReturn = pOld
b2d0: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
b2e0: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65  .    if( pNewIte
b2f0: 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
b300: 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49  y ){.      pNewI
b310: 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
b320: 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  By = sqlite3DbSt
b330: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b340: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
b350: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
b360: 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20  wItem->pIBIndex 
b370: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49  = pOldItem->pIBI
b380: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e  ndex;.    if( pN
b390: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62  ewItem->fg.isTab
b3a0: 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e  Func ){.      pN
b3b0: 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ewItem->u1.pFunc
b3c0: 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20  Arg = .         
b3d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
b3e0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b3f0: 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66  ->u1.pFuncArg, f
b400: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lags);.    }.   
b410: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
b420: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
b430: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
b440: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
b450: 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
b460: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
b470: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
b480: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
b490: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  b, pOldItem->pSe
b4a0: 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  lect, flags);.  
b4b0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20    pNewItem->pOn 
b4c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
b4d0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
b4e0: 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  On, flags);.    
b4f0: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
b500: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
b510: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b520: 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70  ->pUsing);.    p
b530: 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  NewItem->colUsed
b540: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c   = pOldItem->col
b550: 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Used;.  }.  retu
b560: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
b570: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
b580: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b590: 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49   IdList *p){.  I
b5a0: 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  dList *pNew;.  i
b5b0: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
b5c0: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
b5d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b5e0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
b5f0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b600: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
b610: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
b620: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b630: 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49  New->nId = p->nI
b640: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
b650: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b660: 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73  wNN(db, p->nId*s
b670: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
b680: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
b690: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
b6a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77  3DbFree(db, pNew
b6b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
b6c0: 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74  .  }.  /* Note t
b6d0: 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20  hat because the 
b6e0: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f  size of the allo
b6f0: 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b  cation for p->a[
b700: 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65  ] is not.  ** ne
b710: 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65  cessarily a powe
b720: 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65  r of two, sqlite
b730: 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20  3IdListAppend() 
b740: 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  may not be calle
b750: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75  d.  ** on the du
b760: 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20  plicate created 
b770: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
b780: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
b790: 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  i<p->nId; i++){.
b7a0: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
b7b0: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
b7c0: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
b7d0: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
b7e0: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
b7f0: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
b800: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
b810: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b820: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b830: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
b840: 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c  wItem->idx = pOl
b850: 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a  dItem->idx;.  }.
b860: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
b870: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
b880: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
b890: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
b8a0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
b8b0: 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70  Select *pNew, *p
b8c0: 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
b8d0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
b8e0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
b8f0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
b900: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
b910: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  b, sizeof(*p) );
b920: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
b930: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b940: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
b950: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
b960: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c  b, p->pEList, fl
b970: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ags);.  pNew->pS
b980: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
b990: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  istDup(db, p->pS
b9a0: 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  rc, flags);.  pN
b9b0: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
b9c0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b9d0: 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73  p->pWhere, flags
b9e0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  );.  pNew->pGrou
b9f0: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
ba00: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
ba10: 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29  pGroupBy, flags)
ba20: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
ba30: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
ba40: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
ba50: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  g, flags);.  pNe
ba60: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
ba70: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
ba80: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
ba90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
baa0: 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  ->op = p->op;.  
bab0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
bac0: 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53  Prior = sqlite3S
bad0: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
bae0: 70 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a  pPrior, flags);.
baf0: 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70    if( pPrior ) p
bb00: 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
bb10: 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  New;.  pNew->pNe
bb20: 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  xt = 0;.  pNew->
bb30: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
bb40: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
bb50: 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Limit, flags);. 
bb60: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
bb70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
bb80: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20  db, p->pOffset, 
bb90: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
bba0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
bbb0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
bbc0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67  .  pNew->selFlag
bbd0: 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  s = p->selFlags 
bbe0: 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65  & ~SF_UsesEpheme
bbf0: 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64  ral;.  pNew->add
bc00: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d  rOpenEphm[0] = -
bc10: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
bc20: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b  penEphm[1] = -1;
bc30: 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74  .  pNew->nSelect
bc40: 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74  Row = p->nSelect
bc50: 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69  Row;.  pNew->pWi
bc60: 74 68 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c  th = withDup(db,
bc70: 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 73 71   p->pWith);.  sq
bc80: 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
bc90: 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c  me(pNew, p->zSel
bca0: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
bcb0: 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65  pNew;.}.#else.Se
bcc0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
bcd0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
bce0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
bcf0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
bd00: 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72  ert( p==0 );.  r
bd10: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
bd20: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
bd30: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
bd40: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70  he end of an exp
bd50: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
bd60: 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e  f pList is.** in
bd70: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
bd80: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
bd90: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
bda0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
bdb0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
bdc0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
bdd0: 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20 66  entire list is f
bde0: 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c  reed and.** NULL
bdf0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
be00: 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65  f non-NULL is re
be10: 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20  turned, then it 
be20: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
be30: 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e   that the new en
be40: 74 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66  try was successf
be50: 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a  ully appended..*
be60: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
be70: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
be80: 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
be90: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
bea0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
beb0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
bec0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
bed0: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
bee0: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
bef0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
bf00: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
bf10: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
bf20: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
bf30: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
bf40: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
bf50: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
bf60: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
bf70: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
bf80: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
bf90: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
bfa0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
bfb0: 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a  of(ExprList) );.
bfc0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
bfd0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
bfe0: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
bff0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20   pList->nExpr = 
c000: 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20  0;.    pList->a 
c010: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c020: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
c030: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
c040: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
c050: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  a==0 ) goto no_m
c060: 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  em;.  }else if( 
c070: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20  (pList->nExpr & 
c080: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  (pList->nExpr-1)
c090: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
c0a0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
c0b0: 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *a;.    assert(
c0c0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
c0d0: 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  );.    a = sqlit
c0e0: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
c0f0: 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d  pList->a, pList-
c100: 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28  >nExpr*2*sizeof(
c110: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
c120: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
c130: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
c140: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
c150: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
c160: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
c170: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29  !=0 );.  if( 1 )
c180: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
c190: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
c1a0: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
c1b0: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
c1c0: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c     memset(pItem,
c1d0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
c1e0: 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  m));.    pItem->
c1f0: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
c200: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
c210: 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20  t;..no_mem:     
c220: 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  .  /* Avoid leak
c230: 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  ing memory if ma
c240: 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e  lloc has failed.
c250: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
c260: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
c270: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
c280: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
c290: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
c2a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f   0;.}../*.** pCo
c2b0: 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78 70 72 20  lumns and pExpr 
c2c0: 66 6f 72 6d 20 61 20 76 65 63 74 6f 72 20 61 73  form a vector as
c2d0: 73 69 67 6e 6d 65 6e 74 20 77 68 69 63 68 20 69  signment which i
c2e0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 53 45  s part of the SE
c2f0: 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 61  T.** clause of a
c300: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
c310: 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a  nt.  Like this:.
c320: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c  **.**        (a,
c330: 62 2c 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78  b,c) = (expr1,ex
c340: 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72  pr2,expr3).** Or
c350: 3a 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28  :    (a,b,c) = (
c360: 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f  SELECT x,y,z FRO
c370: 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f  M ....).**.** Fo
c380: 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74  r each term of t
c390: 68 65 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e  he vector assign
c3a0: 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77  ment, append new
c3b0: 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a   entries to the.
c3c0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
c3d0: 73 74 20 70 4c 69 73 74 2e 20 20 49 6e 20 74 68  st pList.  In th
c3e0: 65 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 71  e case of a subq
c3f0: 75 65 72 79 20 6f 6e 20 74 68 65 20 4c 48 53 2c  uery on the LHS,
c400: 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45   append.** TK_SE
c410: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72  LECT_COLUMN expr
c420: 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72  essions..*/.Expr
c430: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
c440: 72 4c 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f  rListAppendVecto
c450: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
c460: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  se,         /* P
c470: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c480: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
c490: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist,       /* Li
c4a0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
c4b0: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
c4c0: 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74  NULL */.  IdList
c4d0: 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20   *pColumns,     
c4e0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65   /* List of name
c4f0: 73 20 6f 66 20 4c 48 53 20 6f 66 20 74 68 65 20  s of LHS of the 
c500: 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20  assignment */.  
c510: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
c520: 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72         /* Vector
c530: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
c540: 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68  e appended. Migh
c550: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
c560: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c570: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
c580: 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t n;.  int i;.  
c590: 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 4c 69  int iFirst = pLi
c5a0: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
c5b0: 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c  r : 0;.  /* pCol
c5c0: 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65  umns can only be
c5d0: 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20   NULL due to an 
c5e0: 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77  OOM but an OOM w
c5f0: 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a 20 20 2a  ill cause an.  *
c600: 2a 20 65 78 69 74 20 70 72 69 6f 72 20 74 6f 20  * exit prior to 
c610: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 69  this routine bei
c620: 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20  ng invoked */.  
c630: 69 66 28 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d  if( NEVER(pColum
c640: 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76 65  ns==0) ) goto ve
c650: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
c660: 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  r;.  if( pExpr==
c670: 30 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f  0 ) goto vector_
c680: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20  append_error;.  
c690: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  n = sqlite3ExprV
c6a0: 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29  ectorSize(pExpr)
c6b0: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 73  ;.  if( pColumns
c6c0: 2d 3e 6e 49 64 21 3d 6e 20 29 7b 0a 20 20 20 20  ->nId!=n ){.    
c6d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c6e0: 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
c6f0: 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
c700: 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
c720: 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a  lumns->nId, n);.
c730: 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f      goto vector_
c740: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20  append_error;.  
c750: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
c760: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
c770: 20 2a 70 53 75 62 45 78 70 72 20 3d 20 73 71 6c   *pSubExpr = sql
c780: 69 74 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f  ite3ExprForVecto
c790: 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c 20 70  rField(pParse, p
c7a0: 45 78 70 72 2c 20 69 29 3b 0a 20 20 20 20 70 4c  Expr, i);.    pL
c7b0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
c7c0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
c7d0: 73 65 2c 20 70 4c 69 73 74 2c 20 70 53 75 62 45  se, pList, pSubE
c7e0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  xpr);.    if( pL
c7f0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ist ){.      ass
c800: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
c810: 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20 29 3b  r==iFirst+i+1 );
c820: 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
c830: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e  pList->nExpr-1].
c840: 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73  zName = pColumns
c850: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
c860: 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b      pColumns->a[
c870: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  i].zName = 0;.  
c880: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 45    }.  }.  if( pE
c890: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
c8a0: 43 54 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c  CT ){.    if( pL
c8b0: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b  ist && pList->a[
c8c0: 69 46 69 72 73 74 5d 2e 70 45 78 70 72 20 29 7b  iFirst].pExpr ){
c8d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c8e0: 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e  List->a[iFirst].
c8f0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
c900: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  LECT_COLUMN );. 
c910: 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 46       pList->a[iF
c920: 69 72 73 74 5d 2e 70 45 78 70 72 2d 3e 70 52 69  irst].pExpr->pRi
c930: 67 68 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  ght = pExpr;.   
c940: 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20     pExpr = 0;.  
c950: 20 20 7d 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f    }.  }..vector_
c960: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20  append_error:.  
c970: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
c980: 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
c990: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
c9a0: 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73  ete(db, pColumns
c9b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
c9c0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
c9d0: 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66  the sort order f
c9e0: 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d  or the last elem
c9f0: 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ent on the given
ca00: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f   ExprList..*/.vo
ca10: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
ca20: 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45  stSetSortOrder(E
ca30: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
ca40: 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69  iSortOrder){.  i
ca50: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
ca60: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
ca70: 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c  TE_SO_UNDEFINED<
ca80: 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41  0 && SQLITE_SO_A
ca90: 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  SC>=0 && SQLITE_
caa0: 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61  SO_DESC>0 );.  a
cab0: 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e  ssert( p->nExpr>
cac0: 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74  0 );.  if( iSort
cad0: 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61  Order<0 ){.    a
cae0: 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e  ssert( p->a[p->n
caf0: 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65  Expr-1].sortOrde
cb00: 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  r==SQLITE_SO_ASC
cb10: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
cb20: 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45    }.  p->a[p->nE
cb30: 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72  xpr-1].sortOrder
cb40: 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65   = (u8)iSortOrde
cb50: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  r;.}../*.** Set 
cb60: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
cb70: 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f  .zName element o
cb80: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
cb90: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
cba0: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
cbb0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
cbc0: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
cbd0: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
cbe0: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
cbf0: 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65   pName should ne
cc00: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
cc10: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
cc20: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
cc30: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
cc40: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
cc50: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
cc60: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
cc70: 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61  istSetName(.  Pa
cc80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
cc90: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
cca0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
ccb0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
ccc0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
ccd0: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
cce0: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  e span. */.  Tok
ccf0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
cd00: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20       /* Name to 
cd10: 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e  be added */.  in
cd20: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
cd30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
cd40: 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20   cause the name 
cd50: 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a  to be dequoted *
cd60: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
cd70: 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  List!=0 || pPars
cd80: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
cd90: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
cda0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
cdb0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cdc0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73  m *pItem;.    as
cdd0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
cde0: 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65  pr>0 );.    pIte
cdf0: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
ce00: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
ce10: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
ce20: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ->zName==0 );.  
ce30: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
ce40: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
ce50: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  p(pParse->db, pN
ce60: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
ce70: 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f  );.    if( dequo
ce80: 74 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75  te ) sqlite3Dequ
ce90: 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ote(pItem->zName
cea0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
ceb0: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
cec0: 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65  .a[].zSpan eleme
ced0: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
cee0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
cef0: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
cf00: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
cf10: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
cf20: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
cf30: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
cf40: 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c   But pSpan shoul
cf50: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
cf60: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
cf70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
cf80: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
cf90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
cfa0: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
cfb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
cfc0: 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a  xprListSetSpan(.
cfd0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
cfe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
cff0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d000: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d010: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
d020: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
d030: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
d040: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
d050: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d060: 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64  span to be added
d070: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
d080: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d090: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  b;.  assert( pLi
d0a0: 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  st!=0 || db->mal
d0b0: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
d0c0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
d0d0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
d0e0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
d0f0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
d100: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
d110: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
d120: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73  Expr>0 );.    as
d130: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
d140: 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d  Failed || pItem-
d150: 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70  >pExpr==pSpan->p
d160: 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  Expr );.    sqli
d170: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
d180: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
d190: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
d1a0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
d1b0: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61  (db, (char*)pSpa
d1c0: 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20  n->zStart,.     
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d1f0: 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64  int)(pSpan->zEnd
d200: 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74   - pSpan->zStart
d210: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
d220: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
d230: 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63  on list pEList c
d240: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
d250: 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74  n iLimit element
d260: 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
d270: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
d280: 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  pParse..*/.void 
d290: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
d2a0: 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61  heckLength(.  Pa
d2b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45  rse *pParse,.  E
d2c0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
d2d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d2e0: 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Object.){.  int 
d2f0: 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  mx = pParse->db-
d300: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
d310: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20  IMIT_COLUMN];.  
d320: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
d330: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
d340: 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63  r==mx );.  testc
d350: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
d360: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
d370: 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  +1 );.  if( pELi
d380: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
d390: 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71  xpr>mx ){.    sq
d3a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d3b0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
d3c0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20  columns in %s", 
d3d0: 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a  zObject);.  }.}.
d3e0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
d3f0: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
d400: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  on list..*/.stat
d410: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
d420: 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73 74  NE void exprList
d430: 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33  DeleteNN(sqlite3
d440: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
d450: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
d460: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
d470: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
d480: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
d490: 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  >a!=0 || pList->
d4a0: 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66 6f  nExpr==0 );.  fo
d4b0: 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
d4c0: 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
d4d0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
d4e0: 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
d4f0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
d500: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
d510: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d520: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  (db, pItem->zNam
d530: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
d540: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
d550: 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 73  >zSpan);.  }.  s
d560: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d570: 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71   pList->a);.  sq
d580: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d590: 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73  pList);.}.void s
d5a0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
d5b0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
d5c0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
d5d0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20  t){.  if( pList 
d5e0: 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65  ) exprListDelete
d5f0: 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
d600: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d610: 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66  he bitwise-OR of
d620: 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20   all Expr.flags 
d630: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69  fields in the gi
d640: 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e  ven.** ExprList.
d650: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45  .*/.u32 sqlite3E
d660: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e  xprListFlags(con
d670: 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st ExprList *pLi
d680: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
d690: 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66 28  u32 m = 0;.  if(
d6a0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
d6b0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
d6c0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
d6d0: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
d6e0: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
d6f0: 78 70 72 3b 0a 20 20 20 20 20 20 20 61 73 73 65  xpr;.       asse
d700: 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a  rt( pExpr!=0 );.
d710: 20 20 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70         m |= pExp
d720: 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  r->flags;.    }.
d730: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a    }.  return m;.
d740: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72  }../*.** These r
d750: 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b  outines are Walk
d760: 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65  er callbacks use
d770: 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65  d to check expre
d780: 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65  ssions to.** see
d790: 20 69 66 20 74 68 65 79 20 61 72 65 20 22 63 6f   if they are "co
d7a0: 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65  nstant" for some
d7b0: 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63   definition of c
d7c0: 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a  onstant.  The.**
d7d0: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
d7e0: 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74  lue determines t
d7f0: 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73  he type of "cons
d800: 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f  tant" we are loo
d810: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a  king.** for..**.
d820: 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63  ** These callbac
d830: 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  k routines are u
d840: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
d850: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
d860: 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
d870: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
d880: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
d890: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
d8a0: 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==1.**     sqli
d8b0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
d8c0: 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20  tNotJoin()      
d8d0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
d8e0: 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71  ode==2.**     sq
d8f0: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
d900: 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20  Constant()      
d910: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
d920: 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20  eCode==3.**     
d930: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
d940: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
d950: 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  )        pWalker
d960: 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a  ->eCode==4 or 5.
d970: 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73  **.** In all cas
d980: 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  es, the callback
d990: 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f  s set Walker.eCo
d9a0: 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69  de=0 and abort i
d9b0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
d9c0: 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  .** is found to 
d9d0: 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  not be a constan
d9e0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  t..**.** The sql
d9f0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
da00: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69  ntOrFunction() i
da10: 73 20 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75  s used for evalu
da20: 61 74 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  ating expression
da30: 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  s.** in a CREATE
da40: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
da50: 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43  .  The Walker.eC
da60: 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35 20 77  ode value is 5 w
da70: 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61  hen parsing.** a
da80: 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d  n existing schem
da90: 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f  a and 4 when pro
daa0: 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74  cessing a new st
dab0: 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e  atement.  A boun
dac0: 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72  d.** parameter r
dad0: 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66  aises an error f
dae0: 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74  or new statement
daf0: 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74  s, but is silent
db00: 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ly converted.** 
db10: 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73  to NULL for exis
db20: 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54  ting schemas.  T
db30: 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74  his allows sqlit
db40: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
db50: 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  that .** contain
db60: 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74   a bound paramet
db70: 65 72 20 62 65 63 61 75 73 65 20 74 68 65 79 20  er because they 
db80: 77 65 72 65 20 67 65 6e 65 72 61 74 65 64 20 62  were generated b
db90: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
dba0: 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f  .** of SQLite to
dbb0: 20 62 65 20 70 61 72 73 65 64 20 62 79 20 6e 65   be parsed by ne
dbc0: 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
dbd0: 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72  SQLite without r
dbe0: 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66  aising a.** malf
dbf0: 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72  ormed schema err
dc00: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
dc10: 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  t exprNodeIsCons
dc20: 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  tant(Walker *pWa
dc30: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
dc40: 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61  r){..  /* If pWa
dc50: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32  lker->eCode is 2
dc60: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
dc70: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
dc80: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
dc90: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
dca0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
dcb0: 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73   a left join dis
dcc0: 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78  qualifies the ex
dcd0: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72  pression.  ** fr
dce0: 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  om being conside
dcf0: 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f  red constant. */
dd00: 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  .  if( pWalker->
dd10: 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72  eCode==2 && Expr
dd20: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
dd30: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
dd40: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
dd50: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72  eCode = 0;.    r
dd60: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
dd70: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
dd80: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
dd90: 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e   /* Consider fun
dda0: 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e  ctions to be con
ddb0: 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65  stant if all the
ddc0: 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ir arguments are
ddd0: 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a   constant.    **
dde0: 20 61 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c   and either pWal
ddf0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
de00: 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69   5 or the functi
de10: 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a  on has the.    *
de20: 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  * SQLITE_FUNC_CO
de30: 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20  NST flag. */.   
de40: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
de50: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  N:.      if( pWa
de60: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c  lker->eCode>=4 |
de70: 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
de80: 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74  y(pExpr,EP_Const
de90: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
dea0: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
deb0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
dec0: 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  e{.        pWalk
ded0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
dee0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
def0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
df00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
df10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
df20: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
df30: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
df40: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
df50: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73  OLUMN:.      tes
df60: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
df70: 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20  ==TK_ID );.     
df80: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
df90: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
dfa0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
dfb0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
dfc0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
dfd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
dfe0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
dff0: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
e000: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
e010: 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78 70  eCode==3 && pExp
e020: 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
e030: 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20  er->u.iCur ){.  
e040: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
e050: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
e060: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e070: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
e080: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
e090: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
e0a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e0b0: 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20  K_VARIABLE:.    
e0c0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65    if( pWalker->e
e0d0: 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20  Code==5 ){.     
e0e0: 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63     /* Silently c
e0f0: 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72  onvert bound par
e100: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70 70  ameters that app
e110: 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52  ear inside of CR
e120: 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20  EATE.        ** 
e130: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20  statements into 
e140: 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73  a NULL when pars
e150: 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20 73  ing the CREATE s
e160: 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75  tatement text ou
e170: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  t.        ** of 
e180: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e190: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
e1a0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
e1b0: 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65  K_NULL;.      }e
e1c0: 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  lse if( pWalker-
e1d0: 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20  >eCode==4 ){.   
e1e0: 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20       /* A bound 
e1f0: 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43  parameter in a C
e200: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
e210: 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
e220: 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20  from.        ** 
e230: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
e240: 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f  ) causes an erro
e250: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61  r */.        pWa
e260: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
e270: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e280: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
e290: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
e2a0: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20   through */.    
e2b0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74  default:.      t
e2c0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
e2d0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
e2e0: 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73   /* selectNodeIs
e2f0: 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69  Constant will di
e300: 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20  sallow */.      
e310: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e320: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
e330: 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49  ; /* selectNodeI
e340: 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64  sConstant will d
e350: 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  isallow */.     
e360: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
e370: 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  inue;.  }.}.stat
e380: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64  ic int selectNod
e390: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
e3a0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
e3b0: 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ect *NotUsed){. 
e3c0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
e3d0: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57  R(NotUsed);.  pW
e3e0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
e3f0: 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ;.  return WRC_A
e400: 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69  bort;.}.static i
e410: 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45  nt exprIsConst(E
e420: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74  xpr *p, int init
e430: 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29 7b  Flag, int iCur){
e440: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
e450: 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
e460: 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f  eof(w));.  w.eCo
e470: 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20  de = initFlag;. 
e480: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
e490: 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e   = exprNodeIsCon
e4a0: 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65  stant;.  w.xSele
e4b0: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
e4c0: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
e4d0: 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20  t;.  w.u.iCur = 
e4e0: 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 57  iCur;.  sqlite3W
e4f0: 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a  alkExpr(&w, p);.
e500: 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65    return w.eCode
e510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
e520: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
e530: 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
e540: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
e550: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
e560: 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69  nt.** and 0 if i
e570: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
e580: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
e590: 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   calls..**.** Fo
e5a0: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
e5b0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
e5c0: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
e5d0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
e5e0: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
e5f0: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
e600: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
e610: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
e620: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
e630: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
e640: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
e650: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a  stant(Expr *p){.
e660: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
e670: 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d  onst(p, 1, 0);.}
e680: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
e690: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
e6a0: 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
e6b0: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
e6c0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
e6d0: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
e6e0: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
e6f0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
e700: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
e710: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
e720: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
e730: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
e740: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
e750: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
e760: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
e770: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
e780: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
e790: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
e7a0: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
e7b0: 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a  nst(p, 2, 0);.}.
e7c0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
e7d0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
e7e0: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
e7f0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
e800: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
e810: 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65  * for any single
e820: 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c   row of the tabl
e830: 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43  e with cursor iC
e840: 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ur.  In other wo
e850: 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72  rds, the.** expr
e860: 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20  ession must not 
e870: 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e  refer to any non
e880: 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66  -deterministic f
e890: 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a  unction nor any.
e8a0: 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74  ** table other t
e8b0: 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74  han iCur..*/.int
e8c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
e8d0: 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  bleConstant(Expr
e8e0: 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a   *p, int iCur){.
e8f0: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
e900: 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72 29  onst(p, 3, iCur)
e910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
e920: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
e930: 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
e940: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
e950: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
e960: 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74  nt.** or a funct
e970: 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f  ion call with co
e980: 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
e990: 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20  .  Return and 0 
e9a0: 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
e9b0: 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  any variables..*
e9c0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
e9d0: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
e9e0: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
e9f0: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
ea00: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
ea10: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
ea20: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
ea30: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
ea40: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
ea50: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
ea60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
ea70: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
ea80: 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20  nction(Expr *p, 
ea90: 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73  u8 isInit){.  as
eaa0: 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20  sert( isInit==0 
eab0: 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a  || isInit==1 );.
eac0: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
ead0: 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74  onst(p, 4+isInit
eae0: 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  , 0);.}..#ifdef 
eaf0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55  SQLITE_ENABLE_CU
eb00: 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a  RSOR_HINTS./*.**
eb10: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
eb20: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
eb30: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
eb40: 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61  ssion contains a
eb50: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20  .** subquery of 
eb60: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75  some kind.  Retu
eb70: 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 61 72  rn 0 if there ar
eb80: 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e  e no subqueries.
eb90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
eba0: 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75  xprContainsSubqu
ebb0: 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ery(Expr *p){.  
ebc0: 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
ebd0: 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
ebe0: 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20  (w));.  w.eCode 
ebf0: 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  = 1;.  w.xExprCa
ec00: 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
ec10: 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  ExprWalkNoop;.  
ec20: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
ec30: 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73  k = selectNodeIs
ec40: 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69  Constant;.  sqli
ec50: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
ec60: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
ec70: 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  Code==0;.}.#endi
ec80: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
ec90: 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64  expression p cod
eca0: 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
ecb0: 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
ecc0: 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
ecd0: 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
ece0: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
ecf0: 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
ed00: 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
ed10: 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
ed20: 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
ed30: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
ed40: 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
ed50: 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
ed60: 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
ed70: 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
ed80: 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
ed90: 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
eda0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
edb0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
edc0: 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
edd0: 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74   *pValue){.  int
ede0: 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49   rc = 0;..  /* I
edf0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
ee00: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69  is an integer li
ee10: 74 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20  teral that fits 
ee20: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
ee30: 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c  it.  ** integer,
ee40: 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74   then the EP_Int
ee50: 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20  Value flag will 
ee60: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
ee70: 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72  n set */.  asser
ee80: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54  t( p->op!=TK_INT
ee90: 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67  EGER || (p->flag
eea0: 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  s & EP_IntValue)
eeb0: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  !=0.           |
eec0: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
eed0: 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26  2(p->u.zToken, &
eee0: 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  rc)==0 );..  if(
eef0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49   p->flags & EP_I
ef00: 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a  ntValue ){.    *
ef10: 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56  pValue = p->u.iV
ef20: 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  alue;.    return
ef30: 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68   1;.  }.  switch
ef40: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
ef50: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
ef60: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ef70: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
ef80: 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65  p->pLeft, pValue
ef90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
efa0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
efb0: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
efc0: 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69    int v;.      i
efd0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
efe0: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
eff0: 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20  , &v) ){.       
f000: 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31   assert( v!=(-21
f010: 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20  47483647-1) );. 
f020: 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d         *pValue =
f030: 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20   -v;.        rc 
f040: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
f050: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f060: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
f070: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
f080: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
f090: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
f0a0: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
f0b0: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
f0c0: 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c  sion can be NULL
f0d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
f0e0: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
f0f0: 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68  be NULL or if th
f100: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
f110: 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74  too complex.** t
f120: 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52  o tell return TR
f130: 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  UE.  .**.** This
f140: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
f150: 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   as an optimizat
f160: 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f  ion, to skip OP_
f170: 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  IsNull opcodes.*
f180: 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74  * when we know t
f190: 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e  hat a value cann
f1a0: 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e  ot be NULL.  Hen
f1b0: 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69  ce, a false posi
f1c0: 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69  tive.** (returni
f1d0: 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20  ng TRUE when in 
f1e0: 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73  fact the express
f1f0: 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65  ion can never be
f200: 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20   NULL) might.** 
f210: 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f  be a small perfo
f220: 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69  rmance hit but i
f230: 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d  s otherwise harm
f240: 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74  less.  On the ot
f250: 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66  her.** hand, a f
f260: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72  alse negative (r
f270: 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77  eturning FALSE w
f280: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
f290: 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a  ould be NULL).**
f2a0: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73   will likely res
f2b0: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72  ult in an incorr
f2c0: 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20  ect answer.  So 
f2d0: 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  when in doubt, r
f2e0: 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a  eturn.** TRUE..*
f2f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
f300: 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74  rCanBeNull(const
f310: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20   Expr *p){.  u8 
f320: 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  op;.  while( p->
f330: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
f340: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
f350: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
f360: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
f370: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
f380: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
f390: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
f3a0: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
f3b0: 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
f3c0: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
f3d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
f3e0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  T:.    case TK_B
f3f0: 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72  LOB:.      retur
f400: 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  n 0;.    case TK
f410: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61  _COLUMN:.      a
f420: 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62 21 3d  ssert( p->pTab!=
f430: 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
f440: 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  n ExprHasPropert
f450: 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c  y(p, EP_CanBeNul
f460: 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  l) ||.          
f470: 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d     (p->iColumn>=
f480: 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43  0 && p->pTab->aC
f490: 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e  ol[p->iColumn].n
f4a0: 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20  otNull==0);.    
f4b0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
f4c0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 1;.  }.}..
f4d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
f4e0: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  E if the given e
f4f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
f500: 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f  onstant which wo
f510: 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e  uld be.** unchan
f520: 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69  ged by OP_Affini
f530: 74 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69  ty with the affi
f540: 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68  nity given in th
f550: 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
f560: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ment..**.** This
f570: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
f580: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
f590: 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79   the OP_Affinity
f5a0: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61   operation.** ca
f5b0: 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57  n be omitted.  W
f5c0: 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74  hen in doubt ret
f5d0: 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61  urn FALSE.  A fa
f5e0: 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  lse negative.** 
f5f0: 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20  is harmless.  A 
f600: 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20  false positive, 
f610: 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73  however, can res
f620: 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  ult in the wrong
f630: 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69  .** answer..*/.i
f640: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  nt sqlite3ExprNe
f650: 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
f660: 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  nge(const Expr *
f670: 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20  p, char aff){.  
f680: 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66  u8 op;.  if( aff
f690: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
f6a0: 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  B ) return 1;.  
f6b0: 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  while( p->op==TK
f6c0: 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d  _UPLUS || p->op=
f6d0: 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20  =TK_UMINUS ){ p 
f6e0: 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20  = p->pLeft; }.  
f6f0: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66  op = p->op;.  if
f700: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
f710: 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
f720: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
f730: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
f740: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65  EGER: {.      re
f750: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
f760: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
f770: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
f780: 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20  NUMERIC;.    }. 
f790: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
f7a0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
f7b0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
f7c0: 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51  _REAL || aff==SQ
f7d0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
f7e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f7f0: 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
f800: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
f810: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
f820: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f830: 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
f840: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
f850: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
f860: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  UMN: {.      ass
f870: 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d  ert( p->iTable>=
f880: 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f  0 );  /* p canno
f890: 74 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43  t be part of a C
f8a0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
f8b0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
f8c0: 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20  p->iColumn<0.   
f8d0: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
f8e0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
f8f0: 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ER || aff==SQLIT
f900: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a  E_AFF_NUMERIC);.
f910: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
f920: 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t: {.      retur
f930: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  n 0;.    }.  }.}
f940: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
f950: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
f960: 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77   string is a row
f970: 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  -id column name.
f980: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
f990: 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61  sRowid(const cha
f9a0: 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c  r *z){.  if( sql
f9b0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
f9c0: 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72  _ROWID_")==0 ) r
f9d0: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
f9e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
f9f0: 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72   "ROWID")==0 ) r
fa00: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
fa10: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
fa20: 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74   "OID")==0 ) ret
fa30: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
fa40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69  0;.}../*.** pX i
fa50: 73 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20  s the RHS of an 
fa60: 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  IN operator.  If
fa70: 20 70 58 20 69 73 20 61 20 53 45 4c 45 43 54 20   pX is a SELECT 
fa80: 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68  statement .** th
fa90: 61 74 20 63 61 6e 20 62 65 20 73 69 6d 70 6c 69  at can be simpli
faa0: 66 69 65 64 20 74 6f 20 61 20 64 69 72 65 63 74  fied to a direct
fab0: 20 74 61 62 6c 65 20 61 63 63 65 73 73 2c 20 74   table access, t
fac0: 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  hen return.** a 
fad0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53  pointer to the S
fae0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
faf0: 20 20 49 66 20 70 58 20 69 73 20 6e 6f 74 20 61    If pX is not a
fb00: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
fb10: 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20  t,.** or if the 
fb20: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fb30: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 61 6e   needs to be man
fb40: 69 66 65 73 74 65 64 20 69 6e 74 6f 20 61 20 74  ifested into a t
fb50: 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c  ransient.** tabl
fb60: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e  e, then return N
fb70: 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ULL..*/.#ifndef 
fb80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
fb90: 55 45 52 59 0a 73 74 61 74 69 63 20 53 65 6c 65  UERY.static Sele
fba0: 63 74 20 2a 69 73 43 61 6e 64 69 64 61 74 65 46  ct *isCandidateF
fbb0: 6f 72 49 6e 4f 70 74 28 45 78 70 72 20 2a 70 58  orInOpt(Expr *pX
fbc0: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a  ){.  Select *p;.
fbd0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
fbe0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
fbf0: 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ist;.  Table *pT
fc00: 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ab;.  int i;.  i
fc10: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
fc20: 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
fc30: 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e 20 30  lect) ) return 0
fc40: 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71  ;  /* Not a subq
fc50: 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 45 78  uery */.  if( Ex
fc60: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
fc70: 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
fc80: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
fc90: 20 43 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   Correlated subq
fca0: 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e   */.  p = pX->x.
fcb0: 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70  pSelect;.  if( p
fcc0: 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72  ->pPrior ) retur
fcd0: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
fce0: 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f    /* Not a compo
fcf0: 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  und SELECT */.  
fd00: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
fd10: 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
fd20: 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a  F_Aggregate) ){.
fd30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
fd40: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
fd50: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
fd60: 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
fd70: 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73  tinct );.    tes
fd80: 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
fd90: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
fda0: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
fdb0: 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20  )==SF_Aggregate 
fdc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
fdd0: 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20   /* No DISTINCT 
fde0: 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61  keyword and no a
fdf0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
fe00: 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65  ns */.  }.  asse
fe10: 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
fe20: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
fe30: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f     /* Has no GRO
fe40: 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
fe50: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
fe60: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
fe70: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
fe80: 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  no LIMIT clause 
fe90: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
fea0: 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  pOffset==0 );   
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
fec0: 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f  o LIMIT means no
fed0: 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 66 28   OFFSET */.  if(
fee0: 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
fef0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
ff00: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48      /* Has no WH
ff10: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
ff20: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
ff30: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
ff40: 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  0 );.  if( pSrc-
ff50: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
ff60: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
ff70: 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   Single term in 
ff80: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
ff90: 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
ffa0: 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
ffb0: 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20   0;     /* FROM 
ffc0: 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  is not a subquer
ffd0: 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70  y or view */.  p
ffe0: 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
fff0: 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  .pTab;.  assert(
10000 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
10010 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c  sert( pTab->pSel
10020 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ect==0 );       
10030 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
10040 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65  use is not a vie
10050 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72  w */.  if( IsVir
10060 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
10070 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  urn 0;        /*
10080 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74   FROM clause not
10090 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
100a0 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
100b0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65  ->pEList;.  asse
100c0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
100d0 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54  .  /* All SELECT
100e0 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65   results must be
100f0 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66   columns. */.  f
10100 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
10110 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
10120 20 20 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20     Expr *pRes = 
10130 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
10140 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73  pr;.    if( pRes
10150 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
10160 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
10170 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54  assert( pRes->iT
10180 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d  able==pSrc->a[0]
10190 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20  .iCursor );  /* 
101a0 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64  Not a correlated
101b0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d   subquery */.  }
101c0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23  .  return p;.}.#
101d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
101e0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
101f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10200 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
10210 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
10220 64 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74  de that checks t
10230 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  he left-most col
10240 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62  umn of index tab
10250 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69  le iCur to see i
10260 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73  f.** it contains
10270 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65   any NULL entrie
10280 73 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65  s.  Cause the re
10290 67 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73  gister at regHas
102a0 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a  Null to be set.*
102b0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * to a non-NULL 
102c0 76 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f  value if iCur co
102d0 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e  ntains no NULLs.
102e0 20 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72    Cause register
102f0 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74   regHasNull.** t
10300 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  o be set to NULL
10310 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
10320 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
10330 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  LL values..*/.st
10340 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
10350 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
10360 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75  Vdbe *v, int iCu
10370 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c  r, int regHasNul
10380 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b  l){.  int addr1;
10390 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
103a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
103b0 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  er, 0, regHasNul
103c0 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  l);.  addr1 = sq
103d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
103e0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
103f0 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
10400 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
10410 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10420 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c  Column, iCur, 0,
10430 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
10440 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
10450 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
10460 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65  PEOFARG);.  Vdbe
10470 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72  Comment((v, "fir
10480 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22  st_entry_in(%d)"
10490 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69  , iCur));.  sqli
104a0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
104b0 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e  v, addr1);.}.#en
104c0 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
104d0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
104e0 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  RY./*.** The arg
104f0 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f  ument is an IN o
10500 70 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c  perator with a l
10510 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75  ist (not a subqu
10520 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ery) on the .** 
10530 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e  right-hand side.
10540 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
10550 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f   that list is co
10560 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  nstant..*/.stati
10570 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52  c int sqlite3InR
10580 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70  hsIsConstant(Exp
10590 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20  r *pIn){.  Expr 
105a0 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73  *pLHS;.  int res
105b0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
105c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e  rHasProperty(pIn
105d0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
105e0 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d  );.  pLHS = pIn-
105f0 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70  >pLeft;.  pIn->p
10600 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20  Left = 0;.  res 
10610 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  = sqlite3ExprIsC
10620 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20  onstant(pIn);.  
10630 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48  pIn->pLeft = pLH
10640 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  S;.  return res;
10650 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
10660 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
10670 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d  s used by the im
10680 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
10690 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65  the IN (...) ope
106a0 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58  rator..** The pX
106b0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
106c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20  e expression on 
106d0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
106e0 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63  N operator, whic
106f0 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69  h.** might be ei
10700 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65  ther a list of e
10710 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20  xpressions or a 
10720 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
10730 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
10740 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69  routine is to fi
10750 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
10760 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61  -tree object tha
10770 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  t can.** be used
10780 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20   either to test 
10790 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69  for membership i
107a0 6e 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72  n the RHS set or
107b0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
107c0 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65  ugh.** all membe
107d0 72 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65  rs of the RHS se
107e0 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c  t, skipping dupl
107f0 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  icates..**.** A 
10800 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
10810 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f   on the b-tree o
10820 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68  bject that is th
10830 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
10840 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20  operator.** and 
10850 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65  pX->iTable is se
10860 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
10870 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a  f that cursor..*
10880 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
10890 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  d value of this 
108a0 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74  function indicat
108b0 65 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79  es the b-tree ty
108c0 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  pe, as follows:.
108d0 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  **.**   IN_INDEX
108e0 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68  _ROWID      - Th
108f0 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
10900 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
10910 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  e table..**   IN
10920 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
10930 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
10940 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  as opened on an 
10950 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  ascending index.
10960 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
10970 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20  NDEX_DESC - The 
10980 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
10990 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  d on a descendin
109a0 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
109b0 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20  _INDEX_EPH      
109c0 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
109d0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73  as opened on a s
109e0 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64  pecially created
109f0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a10 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65  populated ephere
10a20 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  mal table..**   
10a30 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20  IN_INDEX_NOOP   
10a40 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20      - No cursor 
10a50 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20  was allocated.  
10a60 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  The IN operator 
10a70 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20  must be.**      
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61     implemented a
10aa0 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  s a sequence of 
10ab0 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a  comparisons..**.
10ac0 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62  ** An existing b
10ad0 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75  -tree might be u
10ae0 73 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65  sed if the RHS e
10af0 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20  xpression pX is 
10b00 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71  a simple.** subq
10b10 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a  uery such as:.**
10b20 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
10b30 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d  column1>, <colum
10b40 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62  n2>... FROM <tab
10b50 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le>.**.** If the
10b60 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
10b70 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
10b80 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70  t or a more comp
10b90 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20 74 68  lex subquery, th
10ba0 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72  en.** an ephemer
10bb0 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e  al table might n
10bc0 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61  eed to be genera
10bd0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53  ted from the RHS
10be0 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d   and then.** pX-
10bf0 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20  >iTable made to 
10c00 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68  point to the eph
10c10 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73  emeral table ins
10c20 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78  tead of an.** ex
10c30 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a  isting table..**
10c40 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20  .** The inFlags 
10c50 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63  parameter must c
10c60 6f 6e 74 61 69 6e 20 65 78 61 63 74 6c 79 20 6f  ontain exactly o
10c70 6e 65 20 6f 66 20 74 68 65 20 62 69 74 73 0a 2a  ne of the bits.*
10c80 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  * IN_INDEX_MEMBE
10c90 52 53 48 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45  RSHIP or IN_INDE
10ca0 58 5f 4c 4f 4f 50 2e 20 20 49 66 20 69 6e 46 6c  X_LOOP.  If inFl
10cb0 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ags contains.** 
10cc0 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
10cd0 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65  HIP, then the ge
10ce0 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20 77 69  nerated table wi
10cf0 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ll be used for a
10d00 0a 2a 2a 20 66 61 73 74 20 6d 65 6d 62 65 72 73  .** fast members
10d10 68 69 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20  hip test.  When 
10d20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  the IN_INDEX_LOO
10d30 50 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68  P bit is set, th
10d40 65 0a 2a 2a 20 49 4e 20 69 6e 64 65 78 20 77 69  e.** IN index wi
10d50 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f  ll be used to lo
10d60 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  op over all valu
10d70 65 73 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66  es of the RHS of
10d80 20 74 68 65 0a 2a 2a 20 49 4e 20 6f 70 65 72 61   the.** IN opera
10d90 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  tor..**.** When 
10da0 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73  IN_INDEX_LOOP is
10db0 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62   used (and the b
10dc0 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
10dd0 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a  ed to iterate.**
10de0 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74   through the set
10df0 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74   members) then t
10e00 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e  he b-tree must n
10e10 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69  ot contain dupli
10e20 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68  cates..** An eph
10e30 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
10e40 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  t be used unless
10e50 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f   the selected co
10e60 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72 61 6e  lumns are guaran
10e70 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e  teed.** to be un
10e80 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65  ique - either be
10e90 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49  cause it is an I
10ea0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
10eb0 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20  EY or due to.** 
10ec0 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  a UNIQUE constra
10ed0 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  int or index..**
10ee0 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
10ef0 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20  X_MEMBERSHIP is 
10f00 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
10f10 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
10f20 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73  d .** for fast s
10f30 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
10f40 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68  sts) then an eph
10f50 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
10f60 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e  t .** be used un
10f70 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69  less <columns> i
10f80 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54 45 47  s a single INTEG
10f90 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
10fa0 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20  olumn or an .** 
10fb0 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66 6f 75  index can be fou
10fc0 6e 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  nd with the spec
10fd0 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20  ified <columns> 
10fe0 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74  as its left-most
10ff0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49  ..**.** If the I
11000 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20  N_INDEX_NOOP_OK 
11010 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  and IN_INDEX_MEM
11020 42 45 52 53 48 49 50 20 61 72 65 20 62 6f 74 68  BERSHIP are both
11030 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74   set and.** if t
11040 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
11050 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
11060 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75  ist (not a subqu
11070 65 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a  ery) then this.*
11080 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  * routine might 
11090 64 65 63 69 64 65 20 74 68 61 74 20 63 72 65 61  decide that crea
110a0 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ting an ephemera
110b0 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d  l b-tree for mem
110c0 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69  bership.** testi
110d0 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73  ng is too expens
110e0 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49  ive and return I
110f0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49  N_INDEX_NOOP.  I
11100 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
11110 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
11120 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65  ine should imple
11130 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72  ment the IN oper
11140 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71  ator using a seq
11150 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f  uence.** of Eq o
11160 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  r Ne comparison 
11170 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
11180 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65  * When the b-tre
11190 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  e is being used 
111a0 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74  for membership t
111b0 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ests, the callin
111c0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69  g function.** mi
111d0 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77  ght need to know
111e0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
111f0 74 68 65 20 52 48 53 20 73 69 64 65 20 6f 66 20  the RHS side of 
11200 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
11210 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55  ** contains a NU
11220 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61 73  LL.  If prRhsHas
11230 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55  Null is not a NU
11240 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a  LL pointer and .
11250 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ** if there is a
11260 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  ny chance that t
11270 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63  he (...) might c
11280 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61  ontain a NULL va
11290 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  lue at.** runtim
112a0 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74  e, then a regist
112b0 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
112c0 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72  and the register
112d0 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a   number written.
112e0 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e  ** to *prRhsHasN
112f0 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73  ull. If there is
11300 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
11310 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69  the (...) contai
11320 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  ns a.** NULL val
11330 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48  ue, then *prRhsH
11340 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75  asNull is left u
11350 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
11360 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73  If a register is
11370 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69   allocated and i
11380 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72  ts location stor
11390 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e  ed in *prRhsHasN
113a0 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ull, then.** the
113b0 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72   value in that r
113c0 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20  egister will be 
113d0 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72  NULL if the b-tr
113e0 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ee contains one 
113f0 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20  or more.** NULL 
11400 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77  values, and it w
11410 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d  ill be some non-
11420 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68  NULL value if th
11430 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
11440 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  s no.** NULL val
11450 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ues..**.** If th
11460 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65 74 65  e aiMap paramete
11470 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  r is not NULL, i
11480 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  t must point to 
11490 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  an array contain
114a0 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65  ing.** one eleme
114b0 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  nt for each colu
114c0 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  mn returned by t
114d0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
114e0 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a  ent on the RHS.*
114f0 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29  * of the IN(...)
11500 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20 69   operator. The i
11510 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  'th entry of the
11520 20 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61   array is popula
11530 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ted with the.** 
11540 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 69 6e  offset of the in
11550 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  dex column that 
11560 6d 61 74 63 68 65 73 20 74 68 65 20 69 27 74 68  matches the i'th
11570 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64   column returned
11580 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   by the.** SELEC
11590 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  T. For example, 
115a0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
115b0 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64 20 69  n and selected i
115c0 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ndex are:.**.** 
115d0 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45    (?,?,?) IN (SE
115e0 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f  LECT a, b, c FRO
115f0 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45 41 54  M t1).**   CREAT
11600 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
11610 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a  (b, c, a);.**.**
11620 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73   then aiMap[] is
11630 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
11640 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69  {2, 0, 1}..*/.#i
11650 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11660 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
11670 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
11680 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
11690 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
116a0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
116b0 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58  xt */.  Expr *pX
116c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
116d0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
116e0 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20  hand side (RHS) 
116f0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
11700 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c  or */.  u32 inFl
11710 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
11720 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c     /* IN_INDEX_L
11730 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50  OOP, _MEMBERSHIP
11740 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f  , and/or _NOOP_O
11750 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68  K */.  int *prRh
11760 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20  sHasNull,       
11770 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
11780 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75  lding NULL statu
11790 73 2e 20 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f  s.  See notes */
117a0 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 20 20  .  int *aiMap   
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
117c0 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e   Mapping from In
117d0 64 65 78 20 66 69 65 6c 64 73 20 74 6f 20 52 48  dex fields to RH
117e0 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20  S fields */.){. 
117f0 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20   Select *p;     
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
11820 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
11830 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
11840 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b    int eType = 0;
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11860 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
11870 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e  of RHS table. IN
11880 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e  _INDEX_* */.  in
11890 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
118a0 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20  >nTab++;        
118b0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
118c0 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a   the RHS table *
118d0 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e  /.  int mustBeUn
118e0 69 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ique;           
118f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
11900 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65  e if RHS must be
11910 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62   unique */.  Vdb
11920 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
11930 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
11940 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61     /* Virtual ma
11950 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65  chine being code
11960 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
11970 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
11980 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20  .  mustBeUnique 
11990 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  = (inFlags & IN_
119a0 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a  INDEX_LOOP)!=0;.
119b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53  .  /* If the RHS
119c0 20 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29   of this IN(...)
119d0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 53   operator is a S
119e0 45 4c 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74  ELECT, and if it
119f0 20 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77   matters .  ** w
11a00 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
11a10 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20  e SELECT result 
11a20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
11a30 6c 75 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74  lues, check whet
11a40 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20  her.  ** or not 
11a50 4e 55 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79  NULL is actually
11a60 20 70 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61   possible (it ma
11a70 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78  y not be, for ex
11a80 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a  ample, due .  **
11a90 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e   to NOT NULL con
11aa0 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
11ab0 73 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e  schema). If no N
11ac0 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70  ULL values are p
11ad0 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65  ossible,.  ** se
11ae0 74 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74  t prRhsHasNull t
11af0 6f 20 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  o 0 before conti
11b00 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28  nuing.  */.  if(
11b10 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26   prRhsHasNull &&
11b20 20 28 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pX->flags & EP
11b30 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
11b40 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78     int i;.    Ex
11b50 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
11b60 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e   pX->x.pSelect->
11b70 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28  pEList;.    for(
11b80 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
11b90 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
11ba0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
11bb0 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73  rCanBeNull(pELis
11bc0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
11bd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11be0 20 20 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d    if( i==pEList-
11bf0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
11c00 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30  prRhsHasNull = 0
11c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11c20 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
11c30 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  f an existing ta
11c40 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  ble or index can
11c50 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a   be used to.  **
11c60 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65   satisfy the que
11c70 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65  ry.  This is pre
11c80 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ferable to gener
11c90 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a  ating a new .  *
11ca0 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  * ephemeral tabl
11cb0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  e.  */.  if( pPa
11cc0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20  rse->nErr==0 && 
11cd0 28 70 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65  (p = isCandidate
11ce0 46 6f 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30  ForInOpt(pX))!=0
11cf0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
11d00 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
11d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11d20 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11d30 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62  ction */.    Tab
11d40 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d60 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61      /* Table <ta
11d70 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36  ble>. */.    i16
11d80 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
11db0 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  idx for pTab */.
11dc0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
11dd0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
11de0 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  ;.    int nExpr 
11df0 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
11e00 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
11e10 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20  >pEList!=0 );   
11e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
11e30 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
11e40 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
11e50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
11e60 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
11e70 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63  xpr!=0 ); /* Bec
11e80 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
11e90 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
11ea0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
11eb0 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20  >pSrc!=0 );     
11ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
11ed0 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
11ee0 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
11ef0 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e  /.    pTab = p->
11f00 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
11f10 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e  ..    /* Code an
11f20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20   OP_Transaction 
11f30 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  and OP_TableLock
11f40 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f   for <table>. */
11f50 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
11f60 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
11f70 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
11f80 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  a);.    sqlite3C
11f90 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
11fa0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
11fb0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
11fc0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
11fd0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
11fe0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
11ff0 20 20 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a    assert(v);  /*
12000 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12010 29 20 68 61 73 20 61 6c 77 61 79 73 20 62 65 65  ) has always bee
12020 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  n previously cal
12030 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  led */.    if( n
12040 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73  Expr==1 && pELis
12050 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69  t->a[0].pExpr->i
12060 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
12070 20 20 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28    /* The "x IN (
12080 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
12090 4d 20 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a  M table)" case *
120a0 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64  /.      int iAdd
120b0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
120c0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
120d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
120e0 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20  erage(v);..     
120f0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
12100 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
12110 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
12120 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65  enRead);.      e
12130 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
12140 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71  ROWID;..      sq
12150 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
12160 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
12170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
12180 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121a0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
121b0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
121c0 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b   int affinity_ok
121d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
121e0 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  i;..      /* Che
121f0 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69  ck that the affi
12200 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62  nity that will b
12210 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72  e used to perfor
12220 6d 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a  m each .      **
12230 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
12240 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61  he same as the a
12250 66 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68 20  ffinity of each 
12260 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a  column in table.
12270 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
12280 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
12290 65 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 6e  erator.  If it n
122a0 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ot, it is not po
122b0 73 73 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ssible to.      
122c0 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78  ** use any index
122d0 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
122e0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  e.  */.      for
122f0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26  (i=0; i<nExpr &&
12300 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b   affinity_ok; i+
12310 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
12320 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33   *pLhs = sqlite3
12330 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
12340 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29  pr(pX->pLeft, i)
12350 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  ;.        int iC
12360 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  ol = pEList->a[i
12370 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
12380 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 69  ;.        char i
12390 64 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54  dxaff = sqlite3T
123a0 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
123b0 74 79 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f  ty(pTab,iCol); /
123c0 2a 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20  * RHS table */. 
123d0 20 20 20 20 20 20 20 63 68 61 72 20 63 6d 70 61         char cmpa
123e0 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
123f0 61 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73  areAffinity(pLhs
12400 2c 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20  , idxaff);.     
12410 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70     testcase( cmp
12420 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
12430 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 20 20  BLOB );.        
12440 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66  testcase( cmpaff
12450 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
12460 54 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69  T );.        swi
12470 74 63 68 28 20 63 6d 70 61 66 66 20 29 7b 0a 20  tch( cmpaff ){. 
12480 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
12490 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20  LITE_AFF_BLOB:. 
124a0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
124b0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ;.          case
124c0 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
124d0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  :.            /*
124e0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
124f0 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72  ffinity() only r
12500 65 74 75 72 6e 73 20 54 45 58 54 20 69 66 20 6f  eturns TEXT if o
12510 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20  ne side or the. 
12520 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74             ** ot
12530 68 65 72 20 68 61 73 20 6e 6f 20 61 66 66 69 6e  her has no affin
12540 69 74 79 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ity and the othe
12550 72 20 73 69 64 65 20 69 73 20 54 45 58 54 2e 20  r side is TEXT. 
12560 20 48 65 6e 63 65 2c 0a 20 20 20 20 20 20 20 20   Hence,.        
12570 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20      ** the only 
12580 77 61 79 20 66 6f 72 20 63 6d 70 61 66 66 20 74  way for cmpaff t
12590 6f 20 62 65 20 54 45 58 54 20 69 73 20 66 6f 72  o be TEXT is for
125a0 20 69 64 78 61 66 66 20 74 6f 20 62 65 20 54 45   idxaff to be TE
125b0 58 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  XT.            *
125c0 2a 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 65  * and for the te
125d0 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  rm on the LHS of
125e0 20 74 68 65 20 49 4e 20 74 6f 20 68 61 76 65 20   the IN to have 
125f0 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  no affinity. */.
12600 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
12610 72 74 28 20 69 64 78 61 66 66 3d 3d 53 51 4c 49  rt( idxaff==SQLI
12620 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
12630 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
12640 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61  ;.          defa
12650 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ult:.           
12660 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73   affinity_ok = s
12670 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
12680 66 66 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b  ffinity(idxaff);
12690 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
126a0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 61 66   }..      if( af
126b0 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20  finity_ok ){.   
126c0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
126d0 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69  or an existing i
126e0 6e 64 65 78 20 74 68 61 74 20 77 69 6c 6c 20 77  ndex that will w
126f0 6f 72 6b 20 66 6f 72 20 74 68 69 73 20 49 4e 20  ork for this IN 
12700 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
12710 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
12720 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
12730 26 26 20 65 54 79 70 65 3d 3d 30 3b 20 70 49 64  && eType==0; pId
12740 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
12750 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
12760 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20 20 20 20  k colUsed;      
12770 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  /* Columns of th
12780 65 20 69 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a  e index used */.
12790 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
127a0 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  k mCol;         
127b0 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20  /* Mask for the 
127c0 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a  current column *
127d0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
127e0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45  pIdx->nColumn<nE
127f0 78 70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  xpr ) continue;.
12800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
12810 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20  imum nColumn is 
12820 42 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31  BMS-2, not BMS-1
12830 2c 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  , so that we can
12840 20 63 6f 6d 70 75 74 65 0a 20 20 20 20 20 20 20   compute.       
12850 20 20 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45     ** BITMASK(nE
12860 78 70 72 29 20 77 69 74 68 6f 75 74 20 6f 76 65  xpr) without ove
12870 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20  rflowing */.    
12880 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12890 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42  pIdx->nColumn==B
128a0 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  MS-2 );.        
128b0 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78    testcase( pIdx
128c0 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31  ->nColumn==BMS-1
128d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
128e0 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
128f0 3d 42 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75  =BMS-1 ) continu
12900 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
12910 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 29 7b   mustBeUnique ){
12920 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
12930 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e   pIdx->nKeyCol>n
12940 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20  Expr.           
12950 20 20 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75    ||(pIdx->nColu
12960 6d 6e 3e 6e 45 78 70 72 20 26 26 20 21 49 73 55  mn>nExpr && !IsU
12970 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
12980 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b  ).            ){
12990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
129a0 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69  ontinue;  /* Thi
129b0 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75  s index is not u
129c0 6e 69 71 75 65 20 6f 76 65 72 20 74 68 65 20 49  nique over the I
129d0 4e 20 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f  N RHS columns */
129e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
129f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
12a00 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20          colUsed 
12a10 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  = 0;   /* Column
12a20 73 20 6f 66 20 69 6e 64 65 78 20 75 73 65 64 20  s of index used 
12a30 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
12a40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
12a50 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
12a60 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
12a70 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  hs = sqlite3Vect
12a80 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
12a90 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  X->pLeft, i);.  
12aa0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
12ab0 70 52 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pRhs = pEList->a
12ac0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
12ad0 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
12ae0 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69  pReq = sqlite3Bi
12af0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
12b00 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c  eq(pParse, pLhs,
12b10 20 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20   pRhs);.        
12b20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20      int j;.  .  
12b30 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
12b40 28 20 70 52 65 71 21 3d 30 20 7c 7c 20 70 52 68  ( pReq!=0 || pRh
12b50 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52  s->iColumn==XN_R
12b60 4f 57 49 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e  OWID || pParse->
12b70 6e 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20  nErr );.        
12b80 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
12b90 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
12ba0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
12bb0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21  dx->aiColumn[j]!
12bc0 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29  =pRhs->iColumn )
12bd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12be0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
12bf0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
12c00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
12c10 20 20 69 66 28 20 70 52 65 71 21 3d 30 20 26 26    if( pReq!=0 &&
12c20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
12c30 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64  pReq->zName, pId
12c40 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30  x->azColl[j])!=0
12c50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12c60 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
12c70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
12c80 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
12c90 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
12ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
12cb0 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62 72 65 61   j==nExpr ) brea
12cc0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  k;.            m
12cd0 43 6f 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29  Col = MASKBIT(j)
12ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
12cf0 28 20 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64  ( mCol & colUsed
12d00 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63   ) break; /* Eac
12d10 68 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e  h column used on
12d20 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20  ly once */.     
12d30 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c         colUsed |
12d40 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = mCol;.        
12d50 20 20 20 20 69 66 28 20 61 69 4d 61 70 20 29 20      if( aiMap ) 
12d60 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20  aiMap[i] = j;.  
12d70 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
12d80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
12d90 3d 3d 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73  ==nExpr || colUs
12da0 65 64 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78  ed!=(MASKBIT(nEx
12db0 70 72 29 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  pr)-1) );.      
12dc0 20 20 20 20 69 66 28 20 63 6f 6c 55 73 65 64 3d      if( colUsed=
12dd0 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29  =(MASKBIT(nExpr)
12de0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
12df0 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
12e00 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
12e10 61 74 20 6d 65 61 6e 73 20 74 68 65 20 69 6e 64  at means the ind
12e20 65 78 20 70 49 64 78 20 69 73 20 75 73 61 62 6c  ex pIdx is usabl
12e30 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
12e40 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
12e50 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
12e60 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
12e70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 23 69 66  Coverage(v);.#if
12e80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12e90 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 20 20 20  _EXPLAIN.       
12ea0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12eb0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
12ec0 6c 61 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  lain, 0, 0, 0,. 
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
12ee0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
12ef0 22 55 53 49 4e 47 20 49 4e 44 45 58 20 25 73 20  "USING INDEX %s 
12f00 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22  FOR IN-OPERATOR"
12f10 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20  ,pIdx->zName),. 
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
12f30 44 59 4e 41 4d 49 43 29 3b 0a 23 65 6e 64 69 66  DYNAMIC);.#endif
12f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
12f50 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12f60 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
12f70 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
12f80 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20   iDb);.         
12f90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
12fa0 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
12fb0 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
12fc0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
12fd0 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
12fe0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
12ff0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49         assert( I
13000 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
13010 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  SC == IN_INDEX_I
13020 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20  NDEX_ASC+1 );.  
13030 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
13040 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
13050 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f  _ASC + pIdx->aSo
13060 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20  rtOrder[0];.  . 
13070 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
13080 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23  rRhsHasNull ){.#
13090 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
130a0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
130b0 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 20 20 20  MASK.           
130c0 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20 28 31     i64 mask = (1
130d0 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20 20 20  <<nExpr)-1;.    
130e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
130f0 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
13100 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  v, OP_ColumnsUse
13110 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
13120 20 20 20 20 20 20 69 54 61 62 2c 20 30 2c 20 30        iTab, 0, 0
13130 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34  , (u8*)&mask, P4
13140 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a  _INT64);.#endif.
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
13160 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b  rRhsHasNull = ++
13170 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
13180 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
13190 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
131a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
131b0 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
131c0 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68  g(v, iTab, *prRh
131d0 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
131e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
131f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13200 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13210 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
13220 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
13230 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64          } /* End
13240 20 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65 78   loop over index
13250 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a  es */.      } /*
13260 20 45 6e 64 20 69 66 28 20 61 66 66 69 6e 69 74   End if( affinit
13270 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20  y_ok ) */.    } 
13280 2f 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e  /* End if not an
13290 20 72 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a   rowid index */.
132a0 20 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d    } /* End attem
132b0 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75  pt to optimize u
132c0 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f  sing an index */
132d0 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65  ..  /* If no pre
132e0 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69  existing index i
132f0 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  s available for 
13300 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20  the IN clause.  
13310 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  ** and IN_INDEX_
13320 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77  NOOP is an allow
13330 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e  ed reply.  ** an
13340 64 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  d the RHS of the
13350 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
13360 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75  a list, not a su
13370 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20  bquery.  ** and 
13380 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63  the RHS is not c
13390 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61 73 20 74  onstant or has t
133a0 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d  wo or fewer term
133b0 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20  s,.  ** then it 
133c0 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65  is not worth cre
133d0 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ating an ephemer
133e0 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c  al table to eval
133f0 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e  uate.  ** the IN
13400 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74   operator so ret
13410 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  urn IN_INDEX_NOO
13420 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  P..  */.  if( eT
13430 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e  ype==0.   && (in
13440 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
13450 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20  _NOOP_OK).   && 
13460 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
13470 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
13480 74 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74  t).   && (!sqlit
13490 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e  e3InRhsIsConstan
134a0 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70  t(pX) || pX->x.p
134b0 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a  List->nExpr<=2).
134c0 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d    ){.    eType =
134d0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a   IN_INDEX_NOOP;.
134e0 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
134f0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  ==0 ){.    /* Co
13500 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20  uld not find an 
13510 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
13520 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61  r index to use a
13530 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65  s the RHS b-tree
13540 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c  ..    ** We will
13550 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74   have to generat
13560 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
13570 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a  able to do the j
13580 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ob..    */.    u
13590 33 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  32 savedNQueryLo
135a0 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
135b0 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  eryLoop;.    int
135c0 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
135d0 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  0;.    eType = I
135e0 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20  N_INDEX_EPH;.   
135f0 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49   if( inFlags & I
13600 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a  N_INDEX_LOOP ){.
13610 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51        pParse->nQ
13620 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20  ueryLoop = 0;.  
13630 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66      if( pX->pLef
13640 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20  t->iColumn<0 && 
13650 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
13660 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
13670 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54  t) ){.        eT
13680 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
13690 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OWID;.      }.  
136a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68    }else if( prRh
136b0 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  sHasNull ){.    
136c0 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
136d0 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  = rMayHaveNull =
136e0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
136f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13700 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
13710 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79  pParse, pX, rMay
13720 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d  HaveNull, eType=
13730 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29  =IN_INDEX_ROWID)
13740 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51  ;.    pParse->nQ
13750 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64  ueryLoop = saved
13760 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65  NQueryLoop;.  }e
13770 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61  lse{.    pX->iTa
13780 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a  ble = iTab;.  }.
13790 0a 20 20 69 66 28 20 61 69 4d 61 70 20 26 26 20  .  if( aiMap && 
137a0 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f  eType!=IN_INDEX_
137b0 49 4e 44 45 58 5f 41 53 43 20 26 26 20 65 54 79  INDEX_ASC && eTy
137c0 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe!=IN_INDEX_IND
137d0 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69  EX_DESC ){.    i
137e0 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d  nt i, n;.    n =
137f0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
13800 6f 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74  orSize(pX->pLeft
13810 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
13820 69 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b  i<n; i++) aiMap[
13830 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65  i] = i;.  }.  re
13840 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65  turn eType;.}.#e
13850 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
13860 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
13870 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  RY./*.** Argumen
13880 74 20 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f  t pExpr is an (?
13890 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20  , ?...) IN(...) 
138a0 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73  expression. This
138b0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c   .** function al
138c0 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
138d0 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  rns a nul-termin
138e0 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74  ated string cont
138f0 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61  aining .** the a
13900 66 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20  ffinities to be 
13910 75 73 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f  used for each co
13920 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70  lumn of the comp
13930 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74  arison..**.** It
13940 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
13950 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
13960 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74  ller to ensure t
13970 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64  hat the returned
13980 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76  .** string is ev
13990 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
139a0 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
139b0 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
139c0 63 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69  char *exprINAffi
139d0 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
139e0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
139f0 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20  {.  Expr *pLeft 
13a00 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
13a10 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
13a20 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
13a30 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c  ze(pLeft);.  Sel
13a40 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28  ect *pSelect = (
13a50 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
13a60 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70  P_xIsSelect) ? p
13a70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
13a80 3a 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  : 0;.  char *zRe
13a90 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45  t;..  assert( pE
13aa0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29  xpr->op==TK_IN )
13ab0 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74  ;.  zRet = sqlit
13ac0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
13ad0 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b  Parse->db, nVal+
13ae0 31 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29  1);.  if( zRet )
13af0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
13b00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c   for(i=0; i<nVal
13b10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
13b20 70 72 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33  pr *pA = sqlite3
13b30 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
13b40 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  pr(pLeft, i);.  
13b50 20 20 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c      char a = sql
13b60 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
13b70 28 70 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20  (pA);.      if( 
13b80 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
13b90 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c     zRet[i] = sql
13ba0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
13bb0 69 74 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ity(pSelect->pEL
13bc0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
13bd0 20 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   a);.      }else
13be0 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69  {.        zRet[i
13bf0 5d 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = a;.      }. 
13c00 20 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56     }.    zRet[nV
13c10 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a  al] = '\0';.  }.
13c20 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
13c30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
13c40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
13c50 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64  QUERY./*.** Load
13c60 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
13c70 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
13c80 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77  first argument w
13c90 69 74 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a  ith an error .**
13ca0 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20   message of the 
13cb0 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73  form:.**.**   "s
13cc0 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
13cd0 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78  s N columns - ex
13ce0 70 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a  pected M".*/   .
13cf0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 75 62 73  void sqlite3Subs
13d00 65 6c 65 63 74 45 72 72 6f 72 28 50 61 72 73 65  electError(Parse
13d10 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41   *pParse, int nA
13d20 63 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65  ctual, int nExpe
13d30 63 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ct){.  const cha
13d40 72 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73  r *zFmt = "sub-s
13d50 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 25 64  elect returns %d
13d60 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
13d70 74 65 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74  ted %d";.  sqlit
13d80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13d90 65 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c  e, zFmt, nActual
13da0 2c 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65  , nExpect);.}.#e
13db0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72  ndif../*.** Expr
13dc0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
13dd0 61 20 76 65 63 74 6f 72 20 74 68 61 74 20 68 61  a vector that ha
13de0 73 20 62 65 65 6e 20 75 73 65 64 20 69 6e 20 61  s been used in a
13df0 20 63 6f 6e 74 65 78 74 20 77 68 65 72 65 0a 2a   context where.*
13e00 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 65 72 6d  * it is not perm
13e10 69 74 74 65 64 2e 20 49 66 20 70 45 78 70 72 20  itted. If pExpr 
13e20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  is a sub-select 
13e30 76 65 63 74 6f 72 2c 20 74 68 69 73 20 72 6f 75  vector, this rou
13e40 74 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73 20 74  tine .** loads t
13e50 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
13e60 77 69 74 68 20 61 20 6d 65 73 73 61 67 65 20 6f  with a message o
13e70 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
13e80 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20  *   "sub-select 
13e90 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e  returns N column
13ea0 73 20 2d 20 65 78 70 65 63 74 65 64 20 31 22 0a  s - expected 1".
13eb0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 74 20  **.** Or, if it 
13ec0 69 73 20 61 20 72 65 67 75 6c 61 72 20 73 63 61  is a regular sca
13ed0 6c 61 72 20 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a  lar vector:.**.*
13ee0 2a 20 20 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  *   "row value m
13ef0 69 73 75 73 65 64 22 0a 2a 2f 20 20 20 0a 76 6f  isused".*/   .vo
13f00 69 64 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72  id sqlite3Vector
13f10 45 72 72 6f 72 4d 73 67 28 50 61 72 73 65 20 2a  ErrorMsg(Parse *
13f20 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
13f30 78 70 72 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  xpr){.#ifndef SQ
13f40 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
13f50 52 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  RY.  if( pExpr->
13f60 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
13f70 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
13f80 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
13f90 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  r(pParse, pExpr-
13fa0 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
13fb0 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20  st->nExpr, 1);. 
13fc0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
13fd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13fe0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
13ff0 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
14000 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
14010 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
14020 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
14030 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73  ries used as a s
14040 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69  ubquery expressi
14050 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f  on, EXISTS,.** o
14060 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  r IN operators. 
14070 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
14080 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
14090 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
140a0 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
140b0 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
140c0 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
140d0 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
140e0 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
140f0 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
14100 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
14110 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
14120 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
14130 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
14140 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
14150 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
14160 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
14170 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
14180 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
14190 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
141a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
141b0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
141c0 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
141d0 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
141e0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
141f0 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
14200 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
14210 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
14220 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
14230 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
14240 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
14250 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
14260 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
14270 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
14280 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
14290 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
142a0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
142b0 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
142c0 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
142d0 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
142e0 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
142f0 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
14300 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
14310 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
14320 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
14330 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
14340 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
14350 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
14360 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
14370 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
14380 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
14390 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
143a0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
143b0 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68  NULLs..** All th
143c0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
143d0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  is initialize th
143e0 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e  e register given
143f0 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   by rMayHaveNull
14400 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61  .** to NULL.  Ca
14410 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77  lling routines w
14420 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ill take care of
14430 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72   changing this r
14440 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65  egister.** value
14450 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20   to non-NULL if 
14460 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d  the RHS is NULL-
14470 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  free..**.** For 
14480 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
14490 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74  TS operator, ret
144a0 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
144b0 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a   that holds the.
144c0 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20  ** result.  For 
144d0 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53  a multi-column S
144e0 45 4c 45 43 54 2c 20 74 68 65 20 72 65 73 75 6c  ELECT, the resul
144f0 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  t is stored in a
14500 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a 20 61   contiguous.** a
14510 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
14520 73 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  s and the return
14530 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 72 65   value is the re
14540 67 69 73 74 65 72 20 6f 66 20 74 68 65 20 6c 65  gister of the le
14550 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73 75 6c  ft-most.** resul
14560 74 20 63 6f 6c 75 6d 6e 2e 20 20 52 65 74 75 72  t column.  Retur
14570 6e 20 30 20 66 6f 72 20 49 4e 20 6f 70 65 72 61  n 0 for IN opera
14580 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72  tors or if an er
14590 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23  ror occurs..*/.#
145a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
145b0 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
145c0 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
145d0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
145e0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
145f0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
14600 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
14610 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
14620 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43  /* The IN, SELEC
14630 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  T, or EXISTS ope
14640 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  rator */.  int r
14650 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20  HasNullFlag,    
14660 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
14670 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74  hat records whet
14680 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20  her NULLs exist 
14690 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  in RHS */.  int 
146a0 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20  isRowid         
146b0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
146c0 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  LHS of IN operat
146d0 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f  or is a rowid */
146e0 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44  .){.  int jmpIfD
146f0 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20  ynamic = -1;    
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
14720 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
14730 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20  int rReg = 0;   
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
14760 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75  ter storing resu
14770 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20  lting */.  Vdbe 
14780 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
14790 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
147a0 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
147b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
147c0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
147d0 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  h(pParse);..  /*
147e0 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   The evaluation 
147f0 6f 66 20 74 68 65 20 49 4e 2f 45 58 49 53 54 53  of the IN/EXISTS
14800 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  /SELECT must be 
14810 72 65 70 65 61 74 65 64 20 65 76 65 72 79 20 74  repeated every t
14820 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65  ime it.  ** is e
14830 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e  ncountered if an
14840 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
14850 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
14860 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
14870 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
14880 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
14890 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
148a0 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
148b0 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
148c0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
148d0 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
148e0 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
148f0 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
14900 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
14910 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
14920 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
14930 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
14940 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
14950 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
14960 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
14970 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
14980 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
14990 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
149a0 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
149b0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
149c0 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
149d0 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e 61  ){.    jmpIfDyna
149e0 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mic = sqlite3Vdb
149f0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
14a00 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
14a10 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  e(v);.  }..#ifnd
14a20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
14a30 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61  XPLAIN.  if( pPa
14a40 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
14a50 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  ){.    char *zMs
14a60 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
14a70 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
14a80 45 58 45 43 55 54 45 20 25 73 25 73 20 53 55 42  EXECUTE %s%s SUB
14a90 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20  QUERY %d",.     
14aa0 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e     jmpIfDynamic>
14ab0 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45  =0?"":"CORRELATE
14ac0 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78  D ",.        pEx
14ad0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c  pr->op==TK_IN?"L
14ae0 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a 20  IST":"SCALAR",. 
14af0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69         pParse->i
14b00 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20  NextSelectId.   
14b10 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
14b20 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14b30 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
14b40 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
14b50 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
14b60 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  IC);.  }.#endif.
14b70 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
14b80 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
14b90 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
14ba0 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
14bc0 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65  ddress of OP_Ope
14bd0 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
14be0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uction */.      
14bf0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
14c00 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74  xpr->pLeft; /* t
14c10 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
14c20 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
14c30 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
14c40 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f  Info = 0;      /
14c50 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f  * Key informatio
14c60 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  n */.      int n
14c70 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Val;            
14c80 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
14c90 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a  f vector pLeft *
14ca0 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e  /.      .      n
14cb0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Val = sqlite3Exp
14cc0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66  rVectorSize(pLef
14cd0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
14ce0 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56  ( !isRowid || nV
14cf0 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20  al==1 );..      
14d00 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20  /* Whether this 
14d10 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45  is an 'x IN(SELE
14d20 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78  CT...)' or an 'x
14d30 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27   IN(<exprlist>)'
14d40 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
14d50 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c  sion it is handl
14d60 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e  ed the same way.
14d70 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74    An ephemeral t
14d80 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a  able is .      *
14d90 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e  * filled with in
14da0 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
14db0 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
14dc0 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
14dd0 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74    ** SELECT or t
14de0 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20  he <exprlist>.. 
14df0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
14e00 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72   If the 'x' expr
14e10 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
14e20 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65  mn value, or the
14e30 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20   SELECT....     
14e40 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
14e50 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76  turns a column v
14e60 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61  alue, then the a
14e70 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a  ffinity of that.
14e80 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20        ** column 
14e90 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
14ea0 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e   the index keys.
14eb0 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64   If both 'x' and
14ec0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45   the.      ** SE
14ed0 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
14ee0 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
14ef0 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
14f00 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20  nity is used.   
14f10 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20     ** if either 
14f20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52  column has NUMER
14f30 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66  IC or INTEGER af
14f40 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68  finity. If neith
14f50 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20  er.      ** 'x' 
14f60 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  nor the SELECT..
14f70 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
14f80 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
14f90 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20  meric affinity. 
14fa0 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e       ** is used.
14fb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14fc0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
14fd0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
14fe0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
14ff0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15000 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
15010 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  al, .          p
15020 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69  Expr->iTable, (i
15030 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b  sRowid?0:nVal));
15040 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
15050 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20  = isRowid ? 0 : 
15060 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
15070 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
15080 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20  nVal, 1);..     
15090 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
150a0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
150b0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
150c0 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20       /* Case 1: 
150d0 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
150e0 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20  ECT ...).       
150f0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47   **.        ** G
15100 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
15110 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  write the result
15120 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  s of the select 
15130 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  into the tempora
15140 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ry.        ** ta
15150 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  ble allocated an
15160 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a  d opened above..
15170 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
15180 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65     Select *pSele
15190 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  ct = pExpr->x.pS
151a0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 45  elect;.        E
151b0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
151c0 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
151d0 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  t;..        asse
151e0 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
151f0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
15200 65 20 4c 48 53 20 61 6e 64 20 52 48 53 20 6f 66  e LHS and RHS of
15210 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
15220 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74   do not match, t
15230 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  hat.        ** e
15240 72 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62  rror will have b
15250 65 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20  een caught long 
15260 62 65 66 6f 72 65 20 77 65 20 72 65 61 63 68 20  before we reach 
15270 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20  this point. */. 
15280 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59         if( ALWAY
15290 53 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  S(pEList->nExpr=
152a0 3d 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  =nVal) ){.      
152b0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
152c0 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  est;.          i
152d0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
152e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
152f0 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
15300 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
15310 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ble);.          
15320 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20  dest.zAffSdst = 
15330 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70  exprINAffinity(p
15340 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
15350 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
15360 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26   (pExpr->iTable&
15370 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78  0x0000FFFF)==pEx
15380 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
15390 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d          pSelect-
153a0 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
153b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
153c0 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61   pSelect->selFla
153d0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
153e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
153f0 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f  stcase( pKeyInfo
15400 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64  ==0 ); /* Caused
15410 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74   by OOM in sqlit
15420 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29  e3KeyInfoAlloc()
15430 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
15440 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
15450 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
15460 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
15470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
15480 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
15490 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b   dest.zAffSdst);
154a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
154b0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
154c0 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  (pKeyInfo);.    
154d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
154e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
154f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
15500 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
15510 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29  , dest.zAffSdst)
15520 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
15530 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20  rt( pKeyInfo!=0 
15540 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63  ); /* OOM will c
15550 61 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20  ause exit after 
15560 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
15570 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
15580 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
15590 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
155a0 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt( pEList->nExp
155b0 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  r>0 );.         
155c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
155d0 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
155e0 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a  le(pKeyInfo) );.
155f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
15600 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b  0; i<nVal; i++){
15610 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
15620 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65  r *p = sqlite3Ve
15630 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
15640 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  (pLeft, i);.    
15650 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
15660 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  ->aColl[i] = sql
15670 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
15680 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20 20  eCollSeq(.      
15690 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
156a0 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  , p, pEList->a[i
156b0 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20 20  ].pExpr.        
156c0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
156d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
156e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
156f0 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  AYS(pExpr->x.pLi
15700 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
15710 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
15720 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
15730 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st).        **. 
15740 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61         ** For ea
15750 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62  ch expression, b
15760 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65  uild an index ke
15770 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75  y from the evalu
15780 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
15790 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e    ** store it in
157a0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
157b0 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20  able. If <expr> 
157c0 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
157d0 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  n use.        **
157e0 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66   that columns af
157f0 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c  finity when buil
15800 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e  ding index keys.
15810 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f   If <expr> is no
15820 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  t.        ** a c
15830 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72  olumn, use numer
15840 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  ic affinity..   
15850 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
15860 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
15870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
15880 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53  inity of the LHS
15890 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20   of the IN */.  
158a0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
158b0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
158c0 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
158d0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73  pList;.        s
158e0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
158f0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
15900 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
15910 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 61 66 66  r3;..        aff
15920 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
15930 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
15940 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
15950 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
15960 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
15970 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
15980 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  B;.        }.   
15990 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
159a0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  o ){.          a
159b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
159c0 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
159d0 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20  (pKeyInfo) );.  
159e0 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
159f0 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c  ->aColl[0] = sql
15a00 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
15a10 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15a20 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Left);.        }
15a30 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
15a40 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
15a50 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
15a60 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
15a70 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
15a80 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
15a90 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
15aa0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
15ab0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
15ac0 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
15ad0 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
15ae0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
15af0 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  0, r2);.        
15b00 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
15b10 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
15b20 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
15b30 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
15b40 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
15b50 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
15b60 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f        int iValTo
15b70 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  Ins;..          
15b80 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  /* If the expres
15b90 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73  sion is not cons
15ba0 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c  tant then we wil
15bb0 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  l need to.      
15bc0 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
15bd0 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73  he test that was
15be0 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65   generated above
15bf0 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
15c00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
15c10 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65  is code only exe
15c20 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63  cutes once.  Bec
15c30 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63  ause for a non-c
15c40 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20  onstant.        
15c50 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
15c60 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e  we need to rerun
15c70 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20   this code each 
15c80 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20  time..          
15c90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
15ca0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
15cb0 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
15cc0 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
15cd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
15ce0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
15cf0 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44  ToNoop(v, jmpIfD
15d00 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20 20 20  ynamic);.       
15d10 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
15d20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
15d30 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
15d40 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
15d50 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
15d60 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
15d70 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
15d80 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
15d90 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45  owid && sqlite3E
15da0 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32  xprIsInteger(pE2
15db0 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b  , &iValToIns) ){
15dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
15dd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15de0 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20  , OP_InsertInt, 
15df0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
15e00 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20  2, iValToIns);. 
15e10 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
15e20 20 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d              r3 =
15e30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15e40 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
15e50 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  E2, r1);.       
15e60 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
15e70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15e80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15e90 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
15ea0 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  Int, r3,.       
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ec0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15ed0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
15ee0 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20  v)+2);.         
15ef0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
15f00 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
15f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15f20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
15f30 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
15f40 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20  e, r2, r3);.    
15f50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
15f60 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15f70 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15f80 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
15f90 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66   r3, 1, r2, &aff
15fa0 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
15fb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15fc0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
15fd0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
15fe0 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r3, 1);.        
15ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16000 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
16010 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70  _IdxInsert, pExp
16020 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
16030 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 1);.         
16040 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
16050 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16060 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16070 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16080 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
16090 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
160a0 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
160b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
160c0 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
160d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
160e0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
160f0 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79  dr, (void *)pKey
16100 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
16110 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16120 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
16130 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
16140 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
16150 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75  ELECT:.    defau
16160 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43  lt: {.      /* C
16170 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c 45 43  ase 3:    (SELEC
16180 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a  T ... FROM ...).
16190 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a        **     or:
161a0 20 20 20 20 45 58 49 53 54 53 28 53 45 4c 45 43      EXISTS(SELEC
161b0 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a  T ... FROM ...).
161c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
161d0 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20  * For a SELECT, 
161e0 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
161f0 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 73 20   put the values 
16200 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  for all columns 
16210 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
16220 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f 20 61  first row into a
16230 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
16240 74 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ters and return 
16250 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20 20 20  the index of.   
16260 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
16270 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 20 20  register..      
16280 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
16290 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53  his is an EXISTS
162a0 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67  , write an integ
162b0 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73  er 0 (not exists
162c0 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a  ) or 1 (exists).
162d0 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20        ** into a 
162e0 72 65 67 69 73 74 65 72 20 61 6e 64 20 72 65 74  register and ret
162f0 75 72 6e 20 74 68 61 74 20 72 65 67 69 73 74 65  urn that registe
16300 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20  r number..      
16310 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 62  **.      ** In b
16320 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 71  oth cases, the q
16330 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65  uery is augmente
16340 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22  d with "LIMIT 1"
16350 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a  .  Any .      **
16360 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d   preexisting lim
16370 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 20  it is discarded 
16380 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  in place of the 
16390 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20  new LIMIT 1..   
163a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65     */.      Sele
163b0 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20  ct *pSel;       
163c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163d0 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
163e0 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20  ement to encode 
163f0 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  */.      SelectD
16400 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20  est dest;       
16410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16420 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69  * How to deal wi
16430 74 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  th SELECT result
16440 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 52   */.      int nR
16450 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f 20  /* Registers to 
16480 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20  allocate */..   
16490 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
164a0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
164b0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
164c0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
164d0 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
164e0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
164f0 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
16500 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
16510 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
16520 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
16530 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
16540 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
16550 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ..      pSel = p
16560 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
16570 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70 45  .      nReg = pE
16580 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
16590 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73  CT ? pSel->pELis
165a0 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20  t->nExpr : 1;.  
165b0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
165c0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
165d0 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d   0, pParse->nMem
165e0 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  +1);.      pPars
165f0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
16600 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
16610 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
16620 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  ){.        dest.
16630 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b  eDest = SRT_Mem;
16640 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69 53  .        dest.iS
16650 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61  dst = dest.iSDPa
16660 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  rm;.        dest
16670 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20  .nSdst = nReg;. 
16680 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16690 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
166a0 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ull, 0, dest.iSD
166b0 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50 61  Parm, dest.iSDPa
166c0 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20  rm+nReg-1);.    
166d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
166e0 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65  (v, "Init subque
166f0 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
16700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16710 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
16720 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20  SRT_Exists;.    
16730 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16740 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
16750 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ger, 0, dest.iSD
16760 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
16770 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
16780 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75  Init EXISTS resu
16790 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lt"));.      }. 
167a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
167b0 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
167c0 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29  b, pSel->pLimit)
167d0 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c  ;.      pSel->pL
167e0 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
167f0 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
16800 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 0a  db, TK_INTEGER,.
16810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16830 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b    &sqlite3IntTok
16840 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  ens[1], 0);.    
16850 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d    pSel->iLimit =
16860 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e   0;.      pSel->
16870 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
16880 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20 20 20  MultiValue;.    
16890 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
168a0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
168b0 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
168c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
168d0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67      }.      rReg
168e0 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
168f0 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56  .      ExprSetVV
16900 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
16910 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
16920 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16930 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61  }.  }..  if( rHa
16940 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20  sNullFlag ){.   
16950 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75   sqlite3SetHasNu
16960 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d  llFlag(v, pExpr-
16970 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c  >iTable, rHasNul
16980 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69  lFlag);.  }..  i
16990 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
169a0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
169b0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
169c0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a   jmpIfDynamic);.
169d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
169e0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
169f0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65  );..  return rRe
16a00 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  g;.}.#endif /* S
16a10 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
16a20 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
16a30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16a40 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20  UERY./*.** Expr 
16a50 70 49 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e  pIn is an IN(...
16a60 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68  ) expression. Th
16a70 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
16a80 6b 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ks that the .** 
16a90 73 75 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68  sub-select on th
16aa0 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28  e RHS of the IN(
16ab0 29 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20 74  ) operator has t
16ac0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
16ad0 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73  f .** columns as
16ae0 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74   the vector on t
16af0 68 65 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74  he LHS. Or, if t
16b00 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
16b10 28 29 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20  () is not .** a 
16b20 73 75 62 2d 71 75 65 72 79 2c 20 74 68 61 74 20  sub-query, that 
16b30 74 68 65 20 4c 48 53 20 69 73 20 61 20 76 65 63  the LHS is a vec
16b40 74 6f 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a  tor of size 1..*
16b50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
16b60 72 43 68 65 63 6b 49 4e 28 50 61 72 73 65 20 2a  rCheckIN(Parse *
16b70 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 49  pParse, Expr *pI
16b80 6e 29 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f  n){.  int nVecto
16b90 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  r = sqlite3ExprV
16ba0 65 63 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70  ectorSize(pIn->p
16bb0 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 28 70 49  Left);.  if( (pI
16bc0 6e 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  n->flags & EP_xI
16bd0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
16be0 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 70 49 6e  if( nVector!=pIn
16bf0 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
16c00 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
16c10 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65      sqlite3Subse
16c20 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
16c30 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74  , pIn->x.pSelect
16c40 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
16c50 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 20   nVector);.     
16c60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
16c70 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65  .  }else if( nVe
16c80 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20 73  ctor!=1 ){.    s
16c90 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f  qlite3VectorErro
16ca0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 49 6e  rMsg(pParse, pIn
16cb0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 72 65  ->pLeft);.    re
16cc0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
16cd0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
16ce0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16cf0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
16d00 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
16d10 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70  de for an IN exp
16d20 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  ression..**.**  
16d30 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
16d40 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20   ...).**      x 
16d50 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
16d60 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  , ...).**.** The
16d70 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
16d80 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c 61  (LHS) is a scala
16d90 72 20 6f 72 20 76 65 63 74 6f 72 20 65 78 70 72  r or vector expr
16da0 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a  ession.  The .**
16db0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
16dc0 20 28 52 48 53 29 20 69 73 20 61 6e 20 61 72 72   (RHS) is an arr
16dd0 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ay of zero or mo
16de0 72 65 20 73 63 61 6c 61 72 20 76 61 6c 75 65 73  re scalar values
16df0 2c 20 6f 72 20 61 0a 2a 2a 20 73 75 62 71 75 65  , or a.** subque
16e00 72 79 2e 20 20 49 66 20 74 68 65 20 52 48 53 20  ry.  If the RHS 
16e10 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
16e20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
16e30 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74  ult columns must
16e40 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 75  .** match the nu
16e50 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
16e60 69 6e 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e  in the vector on
16e70 20 74 68 65 20 4c 48 53 2e 20 20 49 66 20 74 68   the LHS.  If th
16e80 65 20 52 48 53 20 69 73 0a 2a 2a 20 61 20 6c 69  e RHS is.** a li
16e90 73 74 20 6f 66 20 76 61 6c 75 65 73 2c 20 74 68  st of values, th
16ea0 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20 61 20  e LHS must be a 
16eb0 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54  scalar. .**.** T
16ec0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
16ed0 73 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48  s true if the LH
16ee0 53 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 74 61  S value is conta
16ef0 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
16f00 52 48 53 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75  RHS..** The resu
16f10 6c 74 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  lt is false if t
16f20 68 65 20 4c 48 53 20 69 73 20 64 65 66 69 6e 69  he LHS is defini
16f30 74 65 6c 79 20 6e 6f 74 20 69 6e 20 74 68 65 20  tely not in the 
16f40 52 48 53 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65  RHS.  The .** re
16f50 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66 20  sult is NULL if 
16f60 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
16f70 74 68 65 20 4c 48 53 20 69 6e 20 74 68 65 20 52  the LHS in the R
16f80 48 53 20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a  HS cannot be .**
16f90 20 64 65 74 65 72 6d 69 6e 65 64 20 64 75 65 20   determined due 
16fa0 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20  to NULLs..**.** 
16fb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
16fc0 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
16fd0 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66   jumps to destIf
16fe0 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53  False if the LHS
16ff0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74   is not .** cont
17000 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
17010 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f   RHS.  If due to
17020 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74   NULLs we cannot
17030 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
17040 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74  e LHS.** is cont
17050 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
17060 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65   then jump to de
17070 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
17080 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e  e LHS is contain
17090 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
170a0 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74   RHS then fall t
170b0 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65  hrough..**.** Se
170c0 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20 69  e the separate i
170d0 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 64 6f  n-operator.md do
170e0 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65  cumentation file
170f0 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   in the canonica
17100 6c 0a 2a 2a 20 53 51 4c 69 74 65 20 73 6f 75 72  l.** SQLite sour
17110 63 65 20 74 72 65 65 20 66 6f 72 20 61 64 64 69  ce tree for addi
17120 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
17130 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
17140 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
17150 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70  deIN(.  Parse *p
17160 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
17170 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
17180 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
17190 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
171a0 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
171b0 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65 73  /* The IN expres
171c0 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
171d0 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20  stIfFalse,      
171e0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
171f0 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
17200 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20  ined in the RHS 
17210 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e  */.  int destIfN
17220 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ull        /* Ju
17230 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 72  mp here if the r
17240 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f  esults are unkno
17250 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  wn due to NULLs 
17260 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73  */.){.  int rRhs
17270 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a  HasNull = 0;  /*
17280 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20 69   Register that i
17290 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63 6f  s true if RHS co
172a0 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
172b0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  es */.  int eTyp
172c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
172d0 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48 53   Type of the RHS
172e0 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 3b 20   */.  int rLhs; 
172f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17300 65 67 69 73 74 65 72 28 73 29 20 68 6f 6c 64 69  egister(s) holdi
17310 6e 67 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65  ng the LHS value
17320 73 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 4f  s */.  int rLhsO
17330 72 69 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rig;         /* 
17340 4c 48 53 20 76 61 6c 75 65 73 20 70 72 69 6f 72  LHS values prior
17350 20 74 6f 20 72 65 6f 72 64 65 72 69 6e 67 20 62   to reordering b
17360 79 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56  y aiMap[] */.  V
17370 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
17380 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
17390 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
173a0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  tion */.  int *a
173b0 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  iMap = 0;       
173c0 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65 63 74  /* Map from vect
173d0 6f 72 20 66 69 65 6c 64 20 74 6f 20 69 6e 64 65  or field to inde
173e0 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  x column */.  ch
173f0 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20  ar *zAff = 0;   
17400 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
17410 73 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61  string for compa
17420 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  risons */.  int 
17430 6e 56 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20  nVector;        
17440 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63    /* Size of vec
17450 74 6f 72 73 20 66 6f 72 20 74 68 69 73 20 49 4e  tors for this IN
17460 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
17470 6e 74 20 69 44 75 6d 6d 79 3b 20 20 20 20 20 20  nt iDummy;      
17480 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61       /* Dummy pa
17490 72 61 6d 65 74 65 72 20 74 6f 20 65 78 70 72 43  rameter to exprC
174a0 6f 64 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20  odeVector() */. 
174b0 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20   Expr *pLeft;   
174c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48         /* The LH
174d0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
174e0 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ator */.  int i;
174f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17500 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* loop counter 
17510 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65  */.  int destSte
17520 70 32 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68  p2;        /* Wh
17530 65 72 65 20 74 6f 20 6a 75 6d 70 20 77 68 65 6e  ere to jump when
17540 20 4e 55 4c 4c 73 20 73 65 65 6e 20 69 6e 20 73   NULLs seen in s
17550 74 65 70 20 32 20 2a 2f 0a 20 20 69 6e 74 20 64  tep 2 */.  int d
17560 65 73 74 53 74 65 70 36 20 3d 20 30 3b 20 20 20  estStep6 = 0;   
17570 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64   /* Start of cod
17580 65 20 66 6f 72 20 53 74 65 70 20 36 20 2a 2f 0a  e for Step 6 */.
17590 20 20 69 6e 74 20 61 64 64 72 54 72 75 74 68 4f    int addrTruthO
175a0 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  p;      /* Addre
175b0 73 73 20 6f 66 20 6f 70 63 6f 64 65 20 74 68 61  ss of opcode tha
175c0 74 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  t determines the
175d0 20 49 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20   IN is true */. 
175e0 20 69 6e 74 20 64 65 73 74 4e 6f 74 4e 75 6c 6c   int destNotNull
175f0 3b 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ;      /* Jump h
17600 65 72 65 20 69 66 20 61 20 63 6f 6d 70 61 72 69  ere if a compari
17610 73 6f 6e 20 69 73 20 6e 6f 74 20 74 72 75 65 20  son is not true 
17620 69 6e 20 73 74 65 70 20 36 20 2a 2f 0a 20 20 69  in step 6 */.  i
17630 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
17640 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
17650 68 65 20 73 74 65 70 2d 36 20 6c 6f 6f 70 20 2a  he step-6 loop *
17660 2f 20 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70 45  / ..  pLeft = pE
17670 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 66  xpr->pLeft;.  if
17680 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  ( sqlite3ExprChe
17690 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  ckIN(pParse, pEx
176a0 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pr) ) return;.  
176b0 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66 66  zAff = exprINAff
176c0 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45  inity(pParse, pE
176d0 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72 20  xpr);.  nVector 
176e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
176f0 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70  torSize(pExpr->p
17700 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20 3d  Left);.  aiMap =
17710 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44 62   (int*)sqlite3Db
17720 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
17730 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56    pParse->db, nV
17740 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69 6e  ector*(sizeof(in
17750 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72  t) + sizeof(char
17760 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69 66  )) + 1.  );.  if
17770 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
17780 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
17790 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  o sqlite3ExprCod
177a0 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a 0a  eIN_oom_error;..
177b0 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
177c0 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e  compute the RHS.
177d0 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65 70   After this step
177e0 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f 74  , if anything ot
177f0 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49 4e  her than.  ** IN
17800 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
17810 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61 62  eturned, the tab
17820 6c 65 20 6f 70 65 6e 65 64 20 69 74 68 20 63 75  le opened ith cu
17830 72 73 6f 72 20 70 45 78 70 72 2d 3e 69 54 61 62  rsor pExpr->iTab
17840 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  le .  ** contain
17850 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61  s the values tha
17860 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48  t make up the RH
17870 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e  S. If IN_INDEX_N
17880 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c  OOP is returned,
17890 0a 20 20 2a 2a 20 74 68 65 20 52 48 53 20 68 61  .  ** the RHS ha
178a0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  s not yet been c
178b0 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20  oded.  */.  v = 
178c0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
178d0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
178e0 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65         /* OOM de
178f0 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20  tected prior to 
17900 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
17910 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
17920 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20  t((v, "begin IN 
17930 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65  expr"));.  eType
17940 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
17950 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45  Index(pParse, pE
17960 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
17970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17980 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45    IN_INDEX_MEMBE
17990 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58  RSHIP | IN_INDEX
179a0 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20  _NOOP_OK,.      
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 20 20 20 20 20 20 20 64 65 73 74 49 66 46 61 6c         destIfFal
179d0 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f  se==destIfNull ?
179e0 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c   0 : &rRhsHasNul
179f0 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a 20 20 61 73  l, aiMap);..  as
17a00 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
17a10 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31  rr || nVector==1
17a20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
17a30 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20 20 7c  DEX_EPH.       |
17a40 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  | eType==IN_INDE
17a50 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65  X_INDEX_ASC || e
17a60 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
17a70 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a  NDEX_DESC .  );.
17a80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
17a90 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72 6d  BUG.  /* Confirm
17aa0 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20 63 6f   that aiMap[] co
17ab0 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72 20 69  ntains nVector i
17ac0 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 62 65  nteger values be
17ad0 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a 2a  tween 0 and.  **
17ae0 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20   nVector-1. */. 
17af0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
17b00 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  tor; i++){.    i
17b10 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20 66  nt j, cnt;.    f
17b20 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56  or(cnt=j=0; j<nV
17b30 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28 20  ector; j++) if( 
17b40 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e  aiMap[j]==i ) cn
17b50 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t++;.    assert(
17b60 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23   cnt==1 );.  }.#
17b70 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64 65  endif..  /* Code
17b80 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65   the LHS, the <e
17b90 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72  xpr> from "<expr
17ba0 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20  > IN (...)". If 
17bb0 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20  the LHS is a .  
17bc0 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20  ** vector, then 
17bd0 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  it is stored in 
17be0 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63  an array of nVec
17bf0 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 73 74  tor registers st
17c00 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20  arting .  ** at 
17c10 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 71  r1..  **.  ** sq
17c20 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
17c30 28 29 20 6d 69 67 68 74 20 68 61 76 65 20 72 65  () might have re
17c40 6f 72 64 65 72 65 64 20 74 68 65 20 66 69 65 6c  ordered the fiel
17c50 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20 76 65  ds of the LHS ve
17c60 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68 61  ctor.  ** so tha
17c70 74 20 74 68 65 20 66 69 65 6c 64 73 20 61 72 65  t the fields are
17c80 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64   in the same ord
17c90 65 72 20 61 73 20 61 6e 20 65 78 69 73 74 69 6e  er as an existin
17ca0 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65 0a 20  g index.   The. 
17cb0 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72 61   ** aiMap[] arra
17cc0 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 70  y contains a map
17cd0 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f 72  ping from the or
17ce0 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c 64  iginal LHS field
17cf0 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 74   order to.  ** t
17d00 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74  he field order t
17d10 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
17d20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a  RHS index..  */.
17d30 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
17d40 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
17d50 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65 78 70    rLhsOrig = exp
17d60 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72  rCodeVector(pPar
17d70 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d  se, pLeft, &iDum
17d80 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  my);.  for(i=0; 
17d90 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61 69 4d  i<nVector && aiM
17da0 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d  ap[i]==i; i++){}
17db0 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69 65 6c   /* Are LHS fiel
17dc0 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20 2a 2f  ds reordered? */
17dd0 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63 74 6f  .  if( i==nVecto
17de0 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53 20  r ){.    /* LHS 
17df0 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 72  fields are not r
17e00 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20  eordered */.    
17e10 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69 67 3b  rLhs = rLhsOrig;
17e20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
17e30 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64 65 72   Need to reorder
17e40 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64 73 20   the LHS fields 
17e50 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 69 4d  according to aiM
17e60 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d  ap */.    rLhs =
17e70 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17e80 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65  ange(pParse, nVe
17e90 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69  ctor);.    for(i
17ea0 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
17eb0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
17ec0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17ed0 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72 69  OP_Copy, rLhsOri
17ee0 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70 5b  g+i, rLhs+aiMap[
17ef0 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  i], 0);.    }.  
17f00 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74  }..  /* If sqlit
17f10 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20  e3FindInIndex() 
17f20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20  did not find or 
17f30 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20  create an index 
17f40 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69  that is.  ** sui
17f50 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61  table for evalua
17f60 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72  ting the IN oper
17f70 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75  ator, then evalu
17f80 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a  ate using a.  **
17f90 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d   sequence of com
17fa0 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20  parisons..  **. 
17fb0 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74 65 70   ** This is step
17fc0 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e 2d 6f   (1) in the in-o
17fd0 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69 6d  perator.md optim
17fe0 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e 0a  ized algorithm..
17ff0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
18000 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  ==IN_INDEX_NOOP 
18010 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
18020 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
18030 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c  x.pList;.    Col
18040 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
18050 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
18060 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
18070 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20  pLeft);.    int 
18080 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65  labelOk = sqlite
18090 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
180a0 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72  );.    int r2, r
180b0 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e  egToFree;.    in
180c0 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b  t regCkNull = 0;
180d0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
180e0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
180f0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
18100 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
18110 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66  ;.    if( destIf
18120 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73  Null!=destIfFals
18130 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b  e ){.      regCk
18140 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Null = sqlite3Ge
18150 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
18160 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18170 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
18180 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72 4c  BitAnd, rLhs, rL
18190 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  hs, regCkNull);.
181a0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
181b0 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  =0; ii<pList->nE
181c0 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
181d0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
181e0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
181f0 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  e, pList->a[ii].
18200 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65  pExpr, &regToFre
18210 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  e);.      if( re
18220 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74  gCkNull && sqlit
18230 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
18240 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78  pList->a[ii].pEx
18250 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
18260 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
18270 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72  (v, OP_BitAnd, r
18280 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65  egCkNull, r2, re
18290 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  gCkNull);.      
182a0 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c 70  }.      if( ii<p
182b0 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c  List->nExpr-1 ||
182c0 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73   destIfNull!=des
182d0 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
182e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
182f0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp4(v, OP_Eq, 
18300 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72  rLhs, labelOk, r
18310 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
18320 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
18330 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  id*)pColl, P4_CO
18340 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20  LLSEQ);.        
18350 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
18360 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  , ii<pList->nExp
18370 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  r-1);.        Vd
18380 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
18390 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ii==pList->nExpr
183a0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  -1);.        sql
183b0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
183c0 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20  (v, zAff[0]);.  
183d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
183e0 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49     assert( destI
183f0 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c  fNull==destIfFal
18400 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  se );.        sq
18410 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
18420 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c 20  v, OP_Ne, rLhs, 
18430 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c  destIfFalse, r2,
18440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18450 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
18460 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
18470 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61  SEQ); VdbeCovera
18480 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
18490 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
184a0 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20  P5(v, zAff[0] | 
184b0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
184c0 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  L);.      }.    
184d0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
184e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
184f0 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  regToFree);.    
18500 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e  }.    if( regCkN
18510 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ull ){.      sql
18520 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18530 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
18540 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75  CkNull, destIfNu
18550 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ll); VdbeCoverag
18560 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
18570 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
18580 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
18590 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
185a0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
185b0 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20  , labelOk);.    
185c0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
185d0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
185e0 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67 6f  gCkNull);.    go
185f0 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  to sqlite3ExprCo
18600 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  deIN_finished;. 
18610 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32 3a   }..  /* Step 2:
18620 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
18630 20 74 68 65 20 4c 48 53 20 63 6f 6e 74 61 69 6e   the LHS contain
18640 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d  s any NULL colum
18650 6e 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  ns.  If the.  **
18660 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74 61 69   LHS does contai
18670 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68 65  n NULLs then the
18680 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
18690 65 69 74 68 65 72 20 46 41 4c 53 45 20 6f 72 20  either FALSE or 
186a0 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77 69  NULL..  ** We wi
186b0 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  ll then skip the
186c0 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f   binary search o
186d0 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a  f the RHS..  */.
186e0 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c    if( destIfNull
186f0 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  ==destIfFalse ){
18700 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d  .    destStep2 =
18710 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20   destIfFalse;.  
18720 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74 53  }else{.    destS
18730 74 65 70 32 20 3d 20 64 65 73 74 53 74 65 70 36  tep2 = destStep6
18740 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18750 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 0a  keLabel(v);.  }.
18760 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
18770 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
18780 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
18790 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
187a0 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  xpr(pExpr->pLeft
187b0 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71  , i);.    if( sq
187c0 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
187d0 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73  ll(p) ){.      s
187e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
187f0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
18800 4c 68 73 2b 69 2c 20 64 65 73 74 53 74 65 70 32  Lhs+i, destStep2
18810 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
18820 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
18830 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33    }..  /* Step 3
18840 2e 20 20 54 68 65 20 4c 48 53 20 69 73 20 6e 6f  .  The LHS is no
18850 77 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f  w known to be no
18860 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20  n-NULL.  Do the 
18870 62 69 6e 61 72 79 20 73 65 61 72 63 68 0a 20 20  binary search.  
18880 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 20 75 73  ** of the RHS us
18890 69 6e 67 20 74 68 65 20 4c 48 53 20 61 73 20 61  ing the LHS as a
188a0 20 70 72 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e   probe.  If foun
188b0 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  d, the result is
188c0 0a 20 20 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f  .  ** true..  */
188d0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e  .  if( eType==IN
188e0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
188f0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
18900 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20  ase, the RHS is 
18910 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62  the ROWID of tab
18920 6c 65 20 62 2d 74 72 65 65 20 61 6e 64 20 73 6f  le b-tree and so
18930 20 77 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20   we also.    ** 
18940 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 52 48  know that the RH
18950 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20  S is non-NULL.  
18960 48 65 6e 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e  Hence, we combin
18970 65 20 73 74 65 70 73 20 33 20 61 6e 64 20 34 0a  e steps 3 and 4.
18980 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69      ** into a si
18990 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  ngle opcode. */.
189a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
189b0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp3(v, OP_Seek
189c0 52 6f 77 69 64 2c 20 70 45 78 70 72 2d 3e 69 54  Rowid, pExpr->iT
189d0 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
189e0 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20 56 64  e, rLhs);.    Vd
189f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18a00 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d     addrTruthOp =
18a10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18a20 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20  p0(v, OP_Goto); 
18a30 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20   /* Return True 
18a40 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
18a50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18a60 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  4(v, OP_Affinity
18a70 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c  , rLhs, nVector,
18a80 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f   0, zAff, nVecto
18a90 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74  r);.    if( dest
18aa0 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
18ab0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ull ){.      /* 
18ac0 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33 20 61  Combine Step 3 a
18ad0 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f 20 61  nd Step 5 into a
18ae0 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a   single opcode *
18af0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
18b00 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
18b10 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78  OP_NotFound, pEx
18b20 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
18b30 49 66 46 61 6c 73 65 2c 0a 20 20 20 20 20 20 20  IfFalse,.       
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b50 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f      rLhs, nVecto
18b60 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
18b70 28 76 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  (v);.      goto 
18b80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
18b90 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  N_finished;.    
18ba0 7d 0a 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61 72  }.    /* Ordinar
18bb0 79 20 53 74 65 70 20 33 2c 20 66 6f 72 20 74 68  y Step 3, for th
18bc0 65 20 63 61 73 65 20 77 68 65 72 65 20 46 41 4c  e case where FAL
18bd0 53 45 20 61 6e 64 20 4e 55 4c 4c 20 61 72 65 20  SE and NULL are 
18be0 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 20 20  distinct */.    
18bf0 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71  addrTruthOp = sq
18c00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
18c10 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
18c20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
18c30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c50 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56          rLhs, nV
18c60 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65  ector); VdbeCove
18c70 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
18c80 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66 20 74  /* Step 4.  If t
18c90 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20  he RHS is known 
18ca0 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  to be non-NULL a
18cb0 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69  nd we did not fi
18cc0 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68  nd.  ** an match
18cd0 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 20 61   on the search a
18ce0 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
18cf0 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41  esult must be FA
18d00 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  LSE..  */.  if( 
18d10 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e  rRhsHasNull && n
18d20 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20  Vector==1 ){.   
18d30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18d40 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p2(v, OP_NotNull
18d50 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64  , rRhsHasNull, d
18d60 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
18d70 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18d80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  ;.  }..  /* Step
18d90 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f   5.  If we do no
18da0 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
18db0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
18dc0 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a  een NULL and.  *
18dd0 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75  * FALSE, then ju
18de0 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  st return false.
18df0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73   .  */.  if( des
18e00 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
18e10 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64  Null ) sqlite3Vd
18e20 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66  beGoto(v, destIf
18e30 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74  False);..  /* St
18e40 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75  ep 6: Loop throu
18e50 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52  gh rows of the R
18e60 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63  HS.  Compare eac
18e70 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53  h row to the LHS
18e80 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f  ..  ** If any co
18e90 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c  mparison is NULL
18ea0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
18eb0 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61  t is NULL.  If a
18ec0 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73  ll.  ** comparis
18ed0 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20 74 68  ons are FALSE th
18ee0 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73  en the final res
18ef0 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20  ult is FALSE..  
18f00 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63  **.  ** For a sc
18f10 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20  alar LHS, it is 
18f20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68  sufficient to ch
18f30 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72  eck just the fir
18f40 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74  st row.  ** of t
18f50 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69  he RHS..  */.  i
18f60 66 28 20 64 65 73 74 53 74 65 70 36 20 29 20 73  f( destStep6 ) s
18f70 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
18f80 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74  eLabel(v, destSt
18f90 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20  ep6);.  addrTop 
18fa0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
18fb0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
18fc0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
18fd0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
18fe0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18ff0 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e  ;.  if( nVector>
19000 31 20 29 7b 0a 20 20 20 20 64 65 73 74 4e 6f 74  1 ){.    destNot
19010 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
19020 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
19030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19040 46 6f 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20  For nVector==1, 
19050 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 36 20  combine steps 6 
19060 61 6e 64 20 37 20 62 79 20 69 6d 6d 65 64 69 61  and 7 by immedia
19070 74 65 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a 20  tely returning. 
19080 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74     ** FALSE if t
19090 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69  he first compari
190a0 73 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  son is not NULL 
190b0 2a 2f 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75  */.    destNotNu
190c0 6c 6c 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65  ll = destIfFalse
190d0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
190e0 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
190f0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
19100 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
19110 6c 3b 0a 20 20 20 20 69 6e 74 20 72 33 20 3d 20  l;.    int r3 = 
19120 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
19130 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  g(pParse);.    p
19140 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
19150 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65  FieldSubexpr(pLe
19160 66 74 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c  ft, i);.    pCol
19170 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
19180 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
19190 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
191a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
191b0 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54  olumn, pExpr->iT
191c0 61 62 6c 65 2c 20 69 2c 20 72 33 29 3b 0a 20 20  able, i, r3);.  
191d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
191e0 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c  Op4(v, OP_Ne, rL
191f0 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c  hs+i, destNotNul
19200 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20  l, r3,.         
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
19220 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  id*)pColl, P4_CO
19230 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56 64 62 65  LLSEQ);.    Vdbe
19240 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19250 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19260 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19270 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  3);.  }.  sqlite
19280 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19290 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
192a0 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56  fNull);.  if( nV
192b0 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73  ector>1 ){.    s
192c0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
192d0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f  eLabel(v, destNo
192e0 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  tNull);.    sqli
192f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19300 20 4f 50 5f 4e 65 78 74 2c 20 70 45 78 70 72 2d   OP_Next, pExpr-
19310 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 54 6f 70  >iTable, addrTop
19320 2b 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  +1);.    VdbeCov
19330 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f  erage(v);..    /
19340 2a 20 53 74 65 70 20 37 3a 20 20 49 66 20 77 65  * Step 7:  If we
19350 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
19360 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  t, we know that 
19370 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 0a  the result must.
19380 20 20 20 20 2a 2a 20 62 65 20 66 61 6c 73 65 2e      ** be false.
19390 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
193a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
193b0 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46  Goto, 0, destIfF
193c0 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  alse);.  }..  /*
193d0 20 4a 75 6d 70 73 20 68 65 72 65 20 69 6e 20 6f   Jumps here in o
193e0 72 64 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74  rder to return t
193f0 72 75 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rue. */.  sqlite
19400 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
19410 20 61 64 64 72 54 72 75 74 68 4f 70 29 3b 0a 0a   addrTruthOp);..
19420 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
19430 4e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66  N_finished:.  if
19440 28 20 72 4c 68 73 21 3d 72 4c 68 73 4f 72 69 67  ( rLhs!=rLhsOrig
19450 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73   ) sqlite3Releas
19460 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19470 20 72 4c 68 73 29 3b 0a 20 20 73 71 6c 69 74 65   rLhs);.  sqlite
19480 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
19490 61 72 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 6d  arse);.  VdbeCom
194a0 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e  ment((v, "end IN
194b0 20 65 78 70 72 22 29 29 3b 0a 73 71 6c 69 74 65   expr"));.sqlite
194c0 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f  3ExprCodeIN_oom_
194d0 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33  error:.  sqlite3
194e0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
194f0 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c  b, aiMap);.  sql
19500 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
19510 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a  e->db, zAff);.}.
19520 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19530 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
19540 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
19550 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
19560 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  POINT./*.** Gene
19570 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
19580 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
19590 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70  t the floating p
195a0 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65  oint.** value de
195b0 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e  scribed by z[0..
195c0 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
195d0 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er iMem..**.** T
195e0 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69  he z[] string wi
195f0 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  ll probably not 
19600 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  be zero-terminat
19610 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a  ed.  But the .**
19620 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20   z[n] character 
19630 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
19640 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   be something th
19650 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  at does not look
19660 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e  .** like the con
19670 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  tinuation of the
19680 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
19690 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c  ic void codeReal
196a0 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
196b0 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67  char *z, int neg
196c0 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  ateFlag, int iMe
196d0 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  m){.  if( ALWAYS
196e0 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f  (z!=0) ){.    do
196f0 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20  uble value;.    
19700 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26  sqlite3AtoF(z, &
19710 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74  value, sqlite3St
19720 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54  rlen30(z), SQLIT
19730 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73  E_UTF8);.    ass
19740 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e  ert( !sqlite3IsN
19750 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20  aN(value) ); /* 
19760 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76  The new AtoF nev
19770 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a  er returns NaN *
19780 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65  /.    if( negate
19790 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d  Flag ) value = -
197a0 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  value;.    sqlit
197b0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
197c0 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
197d0 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76  iMem, 0, (u8*)&v
197e0 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a  alue, P4_REAL);.
197f0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
19800 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
19810 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
19820 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
19830 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
19840 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
19850 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
19860 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45  er iMem..**.** E
19870 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20  xpr.u.zToken is 
19880 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20  always UTF8 and 
19890 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
198a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
198b0 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73  codeInteger(Pars
198c0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
198d0 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46  *pExpr, int negF
198e0 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
198f0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
19900 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
19910 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
19920 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
19930 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72     int i = pExpr
19940 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
19950 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a  assert( i>=0 );.
19960 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
19970 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71  ) i = -i;.    sq
19980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19990 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
199a0 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  , iMem);.  }else
199b0 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20  {.    int c;.   
199c0 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20   i64 value;.    
199d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
199e0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
199f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
19a00 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c  0 );.    c = sql
19a10 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
19a20 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  4(z, &value);.  
19a30 20 20 69 66 28 20 63 3d 3d 31 20 7c 7c 20 28 63    if( c==1 || (c
19a40 3d 3d 32 20 26 26 20 21 6e 65 67 46 6c 61 67 29  ==2 && !negFlag)
19a50 20 7c 7c 20 28 6e 65 67 46 6c 61 67 20 26 26 20   || (negFlag && 
19a60 76 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f  value==SMALLEST_
19a70 49 4e 54 36 34 29 29 7b 0a 23 69 66 64 65 66 20  INT64)){.#ifdef 
19a80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
19a90 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
19aa0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19ab0 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69  (pParse, "oversi
19ac0 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25  zed integer: %s%
19ad0 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d  s", negFlag ? "-
19ae0 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73  " : "", z);.#els
19af0 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  e.#ifndef SQLITE
19b00 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45  _OMIT_HEX_INTEGE
19b10 52 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  R.      if( sqli
19b20 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22  te3_strnicmp(z,"
19b30 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20  0x",2)==0 ){.   
19b40 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
19b50 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68 65  rMsg(pParse, "he
19b60 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69  x literal too bi
19b70 67 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61  g: %s%s", negFla
19b80 67 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20  g?"-":"",z);.   
19b90 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
19ba0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
19bb0 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e  codeReal(v, z, n
19bc0 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20  egFlag, iMem);. 
19bd0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
19be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
19bf0 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61  f( negFlag ){ va
19c00 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41  lue = c==2 ? SMA
19c10 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76  LLEST_INT64 : -v
19c20 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71  alue; }.      sq
19c30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
19c40 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c  up8(v, OP_Int64,
19c50 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38   0, iMem, 0, (u8
19c60 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54  *)&value, P4_INT
19c70 36 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  64);.    }.  }.}
19c80 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 63 6f  ../*.** Erase co
19c90 6c 75 6d 6e 2d 63 61 63 68 65 20 65 6e 74 72 79  lumn-cache entry
19ca0 20 6e 75 6d 62 65 72 20 69 0a 2a 2f 0a 73 74 61   number i.*/.sta
19cb0 74 69 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e  tic void cacheEn
19cc0 74 72 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a  tryClear(Parse *
19cd0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 29 7b 0a  pParse, int i){.
19ce0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
19cf0 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52  olCache[i].tempR
19d00 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  eg ){.    if( pP
19d10 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
19d20 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
19d30 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
19d40 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
19d50 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
19d60 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73  mpReg++] = pPars
19d70 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
19d80 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iReg;.    }.  }.
19d90 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61    pParse->nColCa
19da0 63 68 65 2d 2d 3b 0a 20 20 69 66 28 20 69 3c 70  che--;.  if( i<p
19db0 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
19dc0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
19dd0 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70  aColCache[i] = p
19de0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
19df0 5b 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  [pParse->nColCac
19e00 68 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  he];.  }.}.../*.
19e10 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  ** Record in the
19e20 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68   column cache th
19e30 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  at a particular 
19e40 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a  column from a.**
19e50 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
19e60 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
19e70 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
19e80 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ster..*/.void sq
19e90 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
19ea0 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ore(Parse *pPars
19eb0 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74  e, int iTab, int
19ec0 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29   iCol, int iReg)
19ed0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
19ee0 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69   minLru;.  int i
19ef0 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20  dxLru;.  struct 
19f00 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
19f10 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72   /* Unless an er
19f20 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
19f30 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  , register numbe
19f40 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f  rs are always po
19f50 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73  sitive. */.  ass
19f60 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70  ert( iReg>0 || p
19f70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
19f80 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
19f90 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73  cFailed );.  ass
19fa0 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26  ert( iCol>=-1 &&
19fb0 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20   iCol<32768 );  
19fc0 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e  /* Finite column
19fd0 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f   numbers */..  /
19fe0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c  * The SQLITE_Col
19ff0 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69  umnCache flag di
1a000 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d  sables the colum
1a010 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69  n cache.  This i
1a020 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20  s used.  ** for 
1a030 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74  testing only - t
1a040 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51  o verify that SQ
1a050 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73  Lite always gets
1a060 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72   the same answer
1a070 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77  .  ** with and w
1a080 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d  ithout the colum
1a090 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  n cache..  */.  
1a0a0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
1a0b0 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d  Disabled(pParse-
1a0c0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75  >db, SQLITE_Colu
1a0d0 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72  mnCache) ) retur
1a0e0 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72  n;..  /* First r
1a0f0 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
1a100 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a  ing entry..  **.
1a110 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
1a120 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d  he way the colum
1a130 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65  n cache is curre
1a140 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72  ntly used, we ar
1a150 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a  e guaranteed.  *
1a160 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63  * that the objec
1a170 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72  t will never alr
1a180 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65  eady be in cache
1a190 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67  .  Verify this g
1a1a0 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23  uarantee..  */.#
1a1b0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1a1c0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
1a1d0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
1a1e0 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1a1f0 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
1a200 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61    assert( p->iTa
1a210 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e  ble!=iTab || p->
1a220 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b  iColumn!=iCol );
1a230 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1a240 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69  * If the cache i
1a250 73 20 61 6c 72 65 61 64 79 20 66 75 6c 6c 2c 20  s already full, 
1a260 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61 73 74  delete the least
1a270 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 65   recently used e
1a280 6e 74 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 50  ntry */.  if( pP
1a290 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3e  arse->nColCache>
1a2a0 3d 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  =SQLITE_N_COLCAC
1a2b0 48 45 20 29 7b 0a 20 20 20 20 6d 69 6e 4c 72 75  HE ){.    minLru
1a2c0 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   = 0x7fffffff;. 
1a2d0 20 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a     idxLru = -1;.
1a2e0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70      for(i=0, p=p
1a2f0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1a300 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
1a310 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
1a320 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6c  {.      if( p->l
1a330 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20  ru<minLru ){.   
1a340 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b       idxLru = i;
1a350 0a 20 20 20 20 20 20 20 20 6d 69 6e 4c 72 75 20  .        minLru 
1a360 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 20 20  = p->lru;.      
1a370 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  }.    }.    p = 
1a380 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
1a390 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 7d 65  he[idxLru];.  }e
1a3a0 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 26 70 50  lse{.    p = &pP
1a3b0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1a3c0 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1a3d0 65 2b 2b 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e++];.  }..  /* 
1a3e0 41 64 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72  Add the new entr
1a3f0 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  y to the end of 
1a400 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 70  the cache */.  p
1a410 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
1a420 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
1a430 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
1a440 61 62 3b 0a 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e  ab;.  p->iColumn
1a450 20 3d 20 69 43 6f 6c 3b 0a 20 20 70 2d 3e 69 52   = iCol;.  p->iR
1a460 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 2d 3e  eg = iReg;.  p->
1a470 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70  tempReg = 0;.  p
1a480 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
1a490 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 7d 0a 0a  iCacheCnt++;.}..
1a4a0 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
1a4b0 68 61 74 20 72 65 67 69 73 74 65 72 73 20 62 65  hat registers be
1a4c0 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67  tween iReg..iReg
1a4d0 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e  +nReg-1 are bein
1a4e0 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a  g overwritten..*
1a4f0 2a 20 50 75 72 67 65 20 74 68 65 20 72 61 6e 67  * Purge the rang
1a500 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66  e of registers f
1a510 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
1a520 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ache..*/.void sq
1a530 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
1a540 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  move(Parse *pPar
1a550 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
1a560 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
1a570 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
1a580 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1a590 68 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  he ){.    struct
1a5a0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 20 3d 20   yColCache *p = 
1a5b0 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
1a5c0 68 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  he[i];.    if( p
1a5d0 2d 3e 69 52 65 67 20 3e 3d 20 69 52 65 67 20 26  ->iReg >= iReg &
1a5e0 26 20 70 2d 3e 69 52 65 67 20 3c 20 69 52 65 67  & p->iReg < iReg
1a5f0 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63  +nReg ){.      c
1a600 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
1a610 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d  Parse, i);.    }
1a620 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  else{.      i++;
1a630 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1a640 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65  .** Remember the
1a650 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20   current column 
1a660 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20  cache context.  
1a670 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20  Any new entries 
1a680 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74  added.** added t
1a690 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  o the column cac
1a6a0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61  he after this ca
1a6b0 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77  ll are removed w
1a6c0 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  hen the.** corre
1a6d0 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63  sponding pop occ
1a6e0 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
1a6f0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1a700 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  h(Parse *pParse)
1a710 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  {.  pParse->iCac
1a720 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65  heLevel++;.#ifde
1a730 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1a740 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
1a750 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1a760 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
1a770 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 55  {.    printf("PU
1a780 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61  SH to %d\n", pPa
1a790 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1a7a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
1a7b0 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72  ./*.** Remove fr
1a7c0 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
1a7d0 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  che any entries 
1a7e0 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20  that were added 
1a7f0 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65  since the.** the
1a800 20 70 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65   previous sqlite
1a810 33 45 78 70 72 43 61 63 68 65 50 75 73 68 20 6f  3ExprCachePush o
1a820 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74  peration.  In ot
1a830 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f  her words, resto
1a840 72 65 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  re.** the cache 
1a850 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20  to the state it 
1a860 77 61 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65  was in prior the
1a870 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73   most recent Pus
1a880 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
1a890 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 50  e3ExprCachePop(P
1a8a0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1a8b0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 61 73   int i = 0;.  as
1a8c0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43  sert( pParse->iC
1a8d0 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a  acheLevel>=1 );.
1a8e0 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
1a8f0 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20  Level--;.#ifdef 
1a900 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
1a910 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
1a920 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
1a930 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
1a940 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20      printf("POP 
1a950 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73   to %d\n", pPars
1a960 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b  e->iCacheLevel);
1a970 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68  .  }.#endif.  wh
1a980 69 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e  ile( i<pParse->n
1a990 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20  ColCache ){.    
1a9a0 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  if( pParse->aCol
1a9b0 43 61 63 68 65 5b 69 5d 2e 69 4c 65 76 65 6c 3e  Cache[i].iLevel>
1a9c0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1a9d0 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63  vel ){.      cac
1a9e0 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
1a9f0 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c  rse, i);.    }el
1aa00 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20  se{.      i++;. 
1aa10 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1aa20 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65 64 20  * When a cached 
1aa30 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73 65 64  column is reused
1aa40 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
1aa50 20 69 74 73 20 72 65 67 69 73 74 65 72 20 69 73   its register is
1aa60 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76  .** no longer av
1aa70 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74 65 6d  ailable as a tem
1aa80 70 20 72 65 67 69 73 74 65 72 2e 20 20 74 69 63  p register.  tic
1aa90 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68 61 74  ket #3879:  that
1aaa0 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65   same.** registe
1aab0 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20 74 68  r might be in th
1aac0 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c 74 69  e cache in multi
1aad0 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f 20 62  ple places, so b
1aae0 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74  e sure to.** get
1aaf0 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74   them all..*/.st
1ab00 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
1ab10 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
1ab20 69 73 74 65 72 28 50 61 72 73 65 20 2a 70 50 61  ister(Parse *pPa
1ab30 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  rse, int iReg){.
1ab40 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1ab50 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
1ab60 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
1ab70 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
1ab80 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1ab90 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  che; i++, p++){.
1aba0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d      if( p->iReg=
1abb0 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70  =iReg ){.      p
1abc0 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
1abd0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47     }.  }.}../* G
1abe0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1abf0 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f  t will load into
1ac00 20 72 65 67 69 73 74 65 72 20 72 65 67 4f 75 74   register regOut
1ac10 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69 73   a value that is
1ac20 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
1ac30 66 6f 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d  for the iIdxCol-
1ac40 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  th column of ind
1ac50 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64  ex pIdx..*/.void
1ac60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ac70 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28  LoadIndexColumn(
1ac80 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1ac90 2c 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e  ,  /* The parsin
1aca0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
1acb0 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f  ndex *pIdx,    /
1acc0 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73  * The index whos
1acd0 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62  e column is to b
1ace0 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e  e loaded */.  in
1acf0 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
1ad00 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
1ad10 20 74 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20   to a table row 
1ad20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c  */.  int iIdxCol
1ad30 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75  ,    /* The colu
1ad40 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  mn of the index 
1ad50 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a  to be loaded */.
1ad60 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20    int regOut    
1ad70 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69    /* Store the i
1ad80 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ndex column valu
1ad90 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  e in this regist
1ada0 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69  er */.){.  i16 i
1adb0 54 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61  TabCol = pIdx->a
1adc0 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d  iColumn[iIdxCol]
1add0 3b 0a 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d  ;.  if( iTabCol=
1ade0 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20  =XN_EXPR ){.    
1adf0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43  assert( pIdx->aC
1ae00 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73  olExpr );.    as
1ae10 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c  sert( pIdx->aCol
1ae20 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78  Expr->nExpr>iIdx
1ae30 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73  Col );.    pPars
1ae40 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54  e->iSelfTab = iT
1ae50 61 62 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74  abCur;.    sqlit
1ae60 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70  e3ExprCodeCopy(p
1ae70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f  Parse, pIdx->aCo
1ae80 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c  lExpr->a[iIdxCol
1ae90 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29  ].pExpr, regOut)
1aea0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1aeb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1aec0 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70  tColumnOfTable(p
1aed0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 49  Parse->pVdbe, pI
1aee0 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61 62  dx->pTable, iTab
1aef0 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cur,.           
1af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af10 20 20 20 20 20 20 20 20 20 69 54 61 62 43 6f 6c           iTabCol
1af20 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d  , regOut);.  }.}
1af30 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1af40 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74   code to extract
1af50 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1af60 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
1af70 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a   of a table..*/.
1af80 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1af90 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1afa0 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c  able(.  Vdbe *v,
1afb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1afc0 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  DBE under constr
1afd0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c  uction */.  Tabl
1afe0 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54  e *pTab,    /* T
1aff0 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
1b000 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f  ing the value */
1b010 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
1b020 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
1b030 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20  cursor.  Or the 
1b040 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49  PK cursor for WI
1b050 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20  THOUT ROWID */. 
1b060 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
1b070 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1b080 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61   column to extra
1b090 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ct */.  int regO
1b0a0 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61  ut      /* Extra
1b0b0 63 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74  ct the value int
1b0c0 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
1b0d0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c  */.){.  if( iCol
1b0e0 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62  <0 || iCol==pTab
1b0f0 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73  ->iPKey ){.    s
1b100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b110 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
1b120 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a  abCur, regOut);.
1b130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1b140 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28   op = IsVirtual(
1b150 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75  pTab) ? OP_VColu
1b160 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a  mn : OP_Column;.
1b170 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c      int x = iCol
1b180 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  ;.    if( !HasRo
1b190 77 69 64 28 70 54 61 62 29 20 26 26 20 21 49 73  wid(pTab) && !Is
1b1a0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
1b1b0 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74  .      x = sqlit
1b1c0 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1b1d0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
1b1e0 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43  yIndex(pTab), iC
1b1f0 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ol);.    }.    s
1b200 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b210 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c  (v, op, iTabCur,
1b220 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d   x, regOut);.  }
1b230 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29  .  if( iCol>=0 )
1b240 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  {.    sqlite3Col
1b250 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
1b260 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ab, iCol, regOut
1b270 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1b280 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1b290 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
1b2a0 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
1b2b0 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
1b2c0 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
1b2d0 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
1b2e0 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65  lue in a registe
1b2f0 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66  r. .**.** An eff
1b300 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 73  ort is made to s
1b310 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
1b320 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
1b330 72 20 69 52 65 67 2e 20 20 54 68 69 73 0a 2a 2a  r iReg.  This.**
1b340 20 69 73 20 6e 6f 74 20 67 61 72 61 6e 74 65 65   is not garantee
1b350 65 64 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e  ed for GetColumn
1b360 28 29 20 2d 20 74 68 65 20 72 65 73 75 6c 74 20  () - the result 
1b370 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e  can be stored in
1b380 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73 74 65 72  .** any register
1b390 2e 20 20 42 75 74 20 74 68 65 20 72 65 73 75 6c  .  But the resul
1b3a0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
1b3b0 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67 69 73  to land in regis
1b3c0 74 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72 20  ter iReg.** for 
1b3d0 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 29  GetColumnToReg()
1b3e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
1b3f0 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75  st be an open cu
1b400 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20  rsor to pTab in 
1b410 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73  iTable when this
1b420 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
1b430 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75  alled.  If iColu
1b440 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69  mn<0 then code i
1b450 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74  s generated that
1b460 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f   extracts the ro
1b470 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  wid..*/.int sqli
1b480 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1b490 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
1b4a0 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
1b4b0 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
1b4c0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
1b4d0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1b4e0 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
1b4f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
1b500 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  e we are reading
1b510 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1b520 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49  Column,     /* I
1b530 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
1b540 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  e column */.  in
1b550 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f  t iTable,      /
1b560 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
1b570 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62  nting to the tab
1b580 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
1b590 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ,        /* Stor
1b5a0 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
1b5b0 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20  /.  u8 p5       
1b5c0 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65       /* P5 value
1b5d0 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b   for OP_Column +
1b5e0 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56   FLAGS */.){.  V
1b5f0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1b600 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
1b610 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1b620 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69  che *p;..  for(i
1b630 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1b640 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
1b650 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
1b660 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
1b670 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62   p->iTable==iTab
1b680 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  le && p->iColumn
1b690 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
1b6a0 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
1b6b0 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
1b6c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b6d0 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
1b6e0 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52  er(pParse, p->iR
1b6f0 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  eg);.      retur
1b700 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  n p->iReg;.    }
1b710 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28  .  }  .  assert(
1b720 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
1b730 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1b740 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
1b750 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  ab, iTable, iCol
1b760 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66  umn, iReg);.  if
1b770 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( p5 ){.    sqli
1b780 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1b790 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b  v, p5);.  }else{
1b7a0 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45     .    sqlite3E
1b7b0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1b7c0 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43  arse, iTable, iC
1b7d0 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
1b7e0 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
1b7f0 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
1b800 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1b810 54 6f 52 65 67 28 0a 20 20 50 61 72 73 65 20 2a  ToReg(.  Parse *
1b820 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
1b830 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1b840 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1b850 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1b860 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
1b870 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
1b880 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
1b890 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
1b8a0 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
1b8b0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
1b8c0 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
1b8d0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1b8e0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
1b8f0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
1b900 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
1b910 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g         /* Sto
1b920 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
1b930 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d  */.){.  int r1 =
1b940 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b950 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1b960 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c  , pTab, iColumn,
1b970 20 69 54 61 62 6c 65 2c 20 69 52 65 67 2c 20 30   iTable, iReg, 0
1b980 29 3b 0a 20 20 69 66 28 20 72 31 21 3d 69 52 65  );.  if( r1!=iRe
1b990 67 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  g ) sqlite3VdbeA
1b9a0 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
1b9b0 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  dbe, OP_SCopy, r
1b9c0 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a  1, iReg);.}.../*
1b9d0 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f  .** Clear all co
1b9e0 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69  lumn cache entri
1b9f0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1ba00 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
1ba10 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  r(Parse *pParse)
1ba20 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 20  {.  int i;..#if 
1ba30 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
1ba40 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
1ba50 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
1ba60 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
1ba70 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41      printf("CLEA
1ba80 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  R\n");.  }.#endi
1ba90 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  f.  for(i=0; i<p
1baa0 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1bab0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1bac0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1bad0 65 5b 69 5d 2e 74 65 6d 70 52 65 67 0a 20 20 20  e[i].tempReg.   
1bae0 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65    && pParse->nTe
1baf0 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
1bb00 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
1bb10 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  ).    ){.       
1bb20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
1bb30 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
1bb40 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61  g++] = pParse->a
1bb50 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
1bb60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
1bb70 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20  arse->nColCache 
1bb80 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
1bb90 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
1bba0 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63  at an affinity c
1bbb0 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72  hange has occurr
1bbc0 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20  ed on iCount.** 
1bbd0 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
1bbe0 6e 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a  ng with iStart..
1bbf0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1bc00 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1bc10 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  Change(Parse *pP
1bc20 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74  arse, int iStart
1bc30 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20  , int iCount){. 
1bc40 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1bc50 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
1bc60 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b  iStart, iCount);
1bc70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1bc80 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20  te code to move 
1bc90 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67  content from reg
1bca0 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69  isters iFrom...i
1bcb0 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f  From+nReg-1.** o
1bcc0 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b  ver to iTo..iTo+
1bcd0 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65  nReg-1. Keep the
1bce0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70   column cache up
1bcf0 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69  -to-date..*/.voi
1bd00 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1bd10 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61  eMove(Parse *pPa
1bd20 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
1bd30 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65  int iTo, int nRe
1bd40 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46  g){.  assert( iF
1bd50 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c  rom>=iTo+nReg ||
1bd60 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f   iFrom+nReg<=iTo
1bd70 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
1bd80 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e  eAddOp3(pParse->
1bd90 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20  pVdbe, OP_Move, 
1bda0 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67  iFrom, iTo, nReg
1bdb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1bdc0 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
1bdd0 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29  se, iFrom, nReg)
1bde0 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
1bdf0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
1be00 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1be10 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a  _COVERAGE_TEST).
1be20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
1be30 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65  e if any registe
1be40 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69  r in the range i
1be50 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75  From..iTo (inclu
1be60 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64  sive).** is used
1be70 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
1be80 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a  column cache..**
1be90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1bea0 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20   is used within 
1beb0 61 73 73 65 72 74 28 29 20 61 6e 64 20 74 65 73  assert() and tes
1bec0 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f  tcase() macros o
1bed0 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  nly.** and does 
1bee0 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61 20  not appear in a 
1bef0 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f  normal build..*/
1bf00 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64  .static int used
1bf10 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61  AsColumnCache(Pa
1bf20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1bf30 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
1bf40 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1bf50 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
1bf60 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
1bf70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1bf80 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ; i<pParse->nCol
1bf90 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29  Cache; i++, p++)
1bfa0 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
1bfb0 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
1bfc0 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54  >=iFrom && r<=iT
1bfd0 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20  o ) return 1;   
1bfe0 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d   /*NO_TEST*/.  }
1bff0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1c000 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1c010 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f  DEBUG || SQLITE_
1c020 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f  COVERAGE_TEST */
1c030 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
1c040 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
1c050 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54  sion node to a T
1c060 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66 65 72  K_REGISTER refer
1c070 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74  encing.** regist
1c080 65 72 20 69 52 65 67 2e 20 20 54 68 65 20 63 61  er iReg.  The ca
1c090 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
1c0a0 20 74 68 61 74 20 69 52 65 67 20 61 6c 72 65 61   that iReg alrea
1c0b0 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  dy contains.** t
1c0c0 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
1c0d0 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
1c0e0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1c0f0 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73 74  oid exprToRegist
1c100 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
1c110 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20  iReg){.  p->op2 
1c120 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70  = p->op;.  p->op
1c130 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
1c140 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52    p->iTable = iR
1c150 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50  eg;.  ExprClearP
1c160 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b  roperty(p, EP_Sk
1c170 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76  ip);.}../*.** Ev
1c180 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
1c190 73 69 6f 6e 20 28 65 69 74 68 65 72 20 61 20 76  sion (either a v
1c1a0 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61  ector or a scala
1c1b0 72 20 65 78 70 72 65 73 73 69 6f 6e 29 20 61 6e  r expression) an
1c1c0 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72  d store.** the r
1c1d0 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67  esult in conting
1c1e0 75 6f 75 73 20 74 65 6d 70 6f 72 61 72 79 20 72  uous temporary r
1c1f0 65 67 69 73 74 65 72 73 2e 20 20 52 65 74 75 72  egisters.  Retur
1c200 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
1c210 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  * the first regi
1c220 73 74 65 72 20 75 73 65 64 20 74 6f 20 73 74 6f  ster used to sto
1c230 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  re the result..*
1c240 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75  *.** If the retu
1c250 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67 69  rned result regi
1c260 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
1c270 61 72 79 20 73 63 61 6c 61 72 2c 20 74 68 65 6e  ary scalar, then
1c280 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74   also write.** t
1c290 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d  hat register num
1c2a0 62 65 72 20 69 6e 74 6f 20 2a 70 69 46 72 65 65  ber into *piFree
1c2b0 61 62 6c 65 2e 20 20 49 66 20 74 68 65 20 72 65  able.  If the re
1c2c0 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65  turned result re
1c2d0 67 69 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f 74  gister.** is not
1c2e0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
1c2f0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1c300 6e 20 69 73 20 61 20 76 65 63 74 6f 72 20 73 65  n is a vector se
1c310 74 20 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a  t *piFreeable.**
1c320 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 0..*/.static
1c330 20 69 6e 74 20 65 78 70 72 43 6f 64 65 56 65 63   int exprCodeVec
1c340 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
1c350 65 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  e, Expr *p, int 
1c360 2a 70 69 46 72 65 65 61 62 6c 65 29 7b 0a 20 20  *piFreeable){.  
1c370 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a 20 20 69  int iResult;.  i
1c380 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c  nt nResult = sql
1c390 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
1c3a0 7a 65 28 70 29 3b 0a 20 20 69 66 28 20 6e 52 65  ze(p);.  if( nRe
1c3b0 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69  sult==1 ){.    i
1c3c0 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
1c3d0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1c3e0 72 73 65 2c 20 70 2c 20 70 69 46 72 65 65 61 62  rse, p, piFreeab
1c3f0 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
1c400 20 20 2a 70 69 46 72 65 65 61 62 6c 65 20 3d 20    *piFreeable = 
1c410 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  0;.    if( p->op
1c420 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
1c430 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73       iResult = s
1c440 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
1c450 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 30  ect(pParse, p, 0
1c460 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1c470 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1c480 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70 50      iResult = pP
1c490 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
1c4a0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1c4b0 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20   += nResult;.   
1c4c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
1c4d0 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  esult; i++){.   
1c4e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1c4f0 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70  CodeFactorable(p
1c500 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73  Parse, p->x.pLis
1c510 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
1c520 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  +iResult);.     
1c530 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1c540 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d  eturn iResult;.}
1c550 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1c560 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
1c570 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
1c580 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
1c590 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
1c5a0 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  .  Attempt to st
1c5b0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1c5c0 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72  in register "tar
1c5d0 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  get"..** Return 
1c5e0 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  the register whe
1c5f0 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  re results are s
1c600 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  tored..**.** Wit
1c610 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  h this routine, 
1c620 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72  there is no guar
1c630 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c  antee that resul
1c640 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74  ts will.** be st
1c650 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20  ored in target. 
1c660 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68   The result migh
1c670 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73  t be stored in s
1c680 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67  ome other.** reg
1c690 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63  ister if it is c
1c6a0 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20  onvenient to do 
1c6b0 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  so.  The calling
1c6c0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
1c6d0 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
1c6e0 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65  rn code and move
1c6f0 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
1c700 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72  the desired.** r
1c710 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
1c720 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1c730 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61  arget(Parse *pPa
1c740 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1c750 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1c760 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1c770 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68  e->pVdbe;  /* Th
1c780 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e VM under const
1c790 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
1c7a0 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1c7b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
1c7c0 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
1c7d0 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20   */.  int inReg 
1c7e0 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20  = target;       
1c7f0 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65  /* Results store
1c800 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e  d in register in
1c810 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  Reg */.  int reg
1c820 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20  Free1 = 0;      
1c830 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
1c840 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
1c850 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
1c860 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  /.  int regFree2
1c870 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1c880 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
1c890 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
1c8a0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
1c8b0 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20 20  nt r1, r2;      
1c8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69           /* Vari
1c8d0 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ous register num
1c8e0 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 74  bers */.  Expr t
1c8f0 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  empX;           
1c900 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
1c910 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
1c920 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20 30   */.  int p5 = 0
1c930 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
1c940 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
1c950 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
1c960 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
1c970 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1c980 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1c990 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
1c9a0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  n 0;.  }..  if( 
1c9b0 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
1c9c0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1c9d0 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
1c9e0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20  pExpr->op;.  }. 
1c9f0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1ca00 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
1ca10 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41  OLUMN: {.      A
1ca20 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1ca30 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
1ca40 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
1ca50 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
1ca60 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
1ca70 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67  aCol[pExpr->iAgg
1ca80 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  ];.      if( !pA
1ca90 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
1caa0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  de ){.        as
1cab0 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d  sert( pCol->iMem
1cac0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  >0 );.        re
1cad0 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b  turn pCol->iMem;
1cae0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1caf0 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f   pAggInfo->useSo
1cb00 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20  rtingIdx ){.    
1cb10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cb20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1cb30 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f  mn, pAggInfo->so
1cb40 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20  rtingIdxPTab,.  
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1cb70 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
1cb80 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1cb90 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1cba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
1cbb0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  * Otherwise, fal
1cbc0 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
1cbd0 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a  TK_COLUMN case *
1cbe0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
1cbf0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
1cc00 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70      int iTab = p
1cc10 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
1cc20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20 29      if( iTab<0 )
1cc30 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
1cc40 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29  arse->ckBase>0 )
1cc50 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  {.          /* G
1cc60 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43 4b 20  enerating CHECK 
1cc70 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 69  constraints or i
1cc80 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 70 61  nserting into pa
1cc90 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20  rtial index */. 
1cca0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1ccb0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b  pExpr->iColumn +
1ccc0 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b   pParse->ckBase;
1ccd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1cce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
1ccf0 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ing an expressio
1cd00 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  n that is part o
1cd10 66 20 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65  f an index where
1cd20 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
1cd30 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
1cd40 65 20 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f  e index refer to
1cd50 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68   the table to wh
1cd60 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 62 65  ich the index be
1cd70 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20  longs */.       
1cd80 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65     iTab = pParse
1cd90 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20  ->iSelfTab;.    
1cda0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1cdb0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1cdc0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1cdd0 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  umn(pParse, pExp
1cde0 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20  r->pTab,.       
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1ce10 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61  Column, iTab, ta
1ce20 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce40 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29       pExpr->op2)
1ce50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ce60 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
1ce70 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
1ce80 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1ce90 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1cea0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1ceb0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1cec0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1ced0 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61  ING_POINT.    ca
1cee0 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
1cef0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1cf00 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1cf10 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1cf20 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52  ) );.      codeR
1cf30 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e  eal(v, pExpr->u.
1cf40 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65  zToken, 0, targe
1cf50 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1cf60 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
1cf70 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
1cf80 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
1cf90 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1cfa0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1cfb0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1cfc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1cfd0 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
1cfe0 20 74 61 72 67 65 74 2c 20 70 45 78 70 72 2d 3e   target, pExpr->
1cff0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1d000 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1d010 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1d020 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
1d030 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d040 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1d050 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1d060 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1d070 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1d080 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
1d090 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
1d0a0 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
1d0b0 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  int n;.      con
1d0c0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
1d0d0 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20    char *zBlob;. 
1d0e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1d0f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1d100 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1d110 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1d120 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1d130 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45  en[0]=='x' || pE
1d140 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
1d150 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61  =='X' );.      a
1d160 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1d170 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20  zToken[1]=='\'' 
1d180 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45  );.      z = &pE
1d190 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d  xpr->u.zToken[2]
1d1a0 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69  ;.      n = sqli
1d1b0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d  te3Strlen30(z) -
1d1c0 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
1d1d0 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ( z[n]=='\'' );.
1d1e0 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71        zBlob = sq
1d1f0 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73  lite3HexToBlob(s
1d200 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c  qlite3VdbeDb(v),
1d210 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71   z, n);.      sq
1d220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1d230 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c  v, OP_Blob, n/2,
1d240 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f   target, 0, zBlo
1d250 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  b, P4_DYNAMIC);.
1d260 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1d270 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  get;.    }.#endi
1d280 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
1d290 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
1d2a0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1d2b0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1d2c0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1d2d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1d2e0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30  xpr->u.zToken!=0
1d2f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1d300 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1d310 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  n[0]!=0 );.     
1d320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d330 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c  p2(v, OP_Variabl
1d340 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
1d350 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
1d360 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a    if( pExpr->u.z
1d370 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20  Token[1]!=0 ){. 
1d380 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1d390 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 56 4c  r *z = sqlite3VL
1d3a0 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61  istNumToName(pPa
1d3b0 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 70 45 78  rse->pVList, pEx
1d3c0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
1d3d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1d3e0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
1d3f0 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63 6d 70 28  =='?' || strcmp(
1d400 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1d410 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20   z)==0 );.      
1d420 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74    pParse->pVList
1d430 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e 64 69  [0] = 0; /* Indi
1d440 63 61 74 65 20 56 4c 69 73 74 20 6d 61 79 20 6e  cate VList may n
1d450 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65 6e 6c 61  o longer be enla
1d460 72 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  rged */.        
1d470 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
1d480 64 50 34 28 76 2c 20 28 63 68 61 72 2a 29 7a 2c  dP4(v, (char*)z,
1d490 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1d4a0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1d4b0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1d4c0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
1d4d0 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65  STER: {.      re
1d4e0 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54 61 62  turn pExpr->iTab
1d4f0 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  le;.    }.#ifnde
1d500 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
1d510 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ST.    case TK_C
1d520 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  AST: {.      /* 
1d530 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
1d540 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28  he form:   CAST(
1d550 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20  pLeft AS token) 
1d560 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  */.      inReg =
1d570 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d580 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1d590 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
1d5a0 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
1d5b0 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b  inReg!=target ){
1d5c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d5d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d5e0 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
1d5f0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1d600 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
1d610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1d620 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d630 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67  v, OP_Cast, targ
1d640 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
1d650 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1d660 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
1d670 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1d680 20 30 29 29 3b 0a 20 20 20 20 20 20 74 65 73 74   0));.      test
1d690 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75  case( usedAsColu
1d6a0 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
1d6b0 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b  inReg, inReg) );
1d6c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1d6d0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1d6e0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e  hange(pParse, in
1d6f0 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 72  Reg, 1);.      r
1d700 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 20 20 20  eturn inReg;.   
1d710 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1d720 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
1d730 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
1d740 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1d750 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  OT:.      op = (
1d760 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
1d770 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
1d780 20 20 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55    p5 = SQLITE_NU
1d790 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66  LLEQ;.      /* f
1d7a0 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all-through */. 
1d7b0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
1d7c0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
1d7d0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
1d7e0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
1d7f0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
1d800 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
1d810 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
1d820 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
1d830 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
1d840 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
1d850 28 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20  (pLeft) ){.     
1d860 20 20 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d     codeVectorCom
1d870 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1d880 70 72 2c 20 74 61 72 67 65 74 2c 20 6f 70 2c 20  pr, target, op, 
1d890 70 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p5);.      }else
1d8a0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
1d8b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1d8c0 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  mp(pParse, pLeft
1d8d0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1d8e0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1d8f0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1d900 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1d910 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1d920 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f  ;.        codeCo
1d930 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
1d940 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1d950 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1d960 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
1d970 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
1d980 32 20 7c 20 70 35 29 3b 0a 20 20 20 20 20 20 20  2 | p5);.       
1d990 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
1d9a0 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
1d9b0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
1d9c0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1d9d0 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20  =OP_Lt);.       
1d9e0 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
1d9f0 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
1da00 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
1da10 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1da20 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20  =OP_Le);.       
1da30 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
1da40 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
1da50 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
1da60 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1da70 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 20  =OP_Gt);.       
1da80 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
1da90 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
1daa0 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
1dab0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1dac0 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 20  =OP_Ge);.       
1dad0 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
1dae0 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
1daf0 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
1db00 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1db10 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 20  =OP_Eq);.       
1db20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
1db30 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
1db40 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65  op==OP_Ne); Vdbe
1db50 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1db60 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20  =OP_Ne);.       
1db70 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1db80 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1db90 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1dba0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1dbb0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1dbc0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1dbd0 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  K_AND:.    case 
1dbe0 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  TK_OR:.    case 
1dbf0 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  TK_PLUS:.    cas
1dc00 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63  e TK_STAR:.    c
1dc10 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20  ase TK_MINUS:.  
1dc20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20    case TK_REM:. 
1dc30 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
1dc40 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  D:.    case TK_B
1dc50 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  ITOR:.    case T
1dc60 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73  K_SLASH:.    cas
1dc70 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
1dc80 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
1dc90 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f   .    case TK_CO
1dca0 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  NCAT: {.      as
1dcb0 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50  sert( TK_AND==OP
1dcc0 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20  _And );         
1dcd0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1dce0 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20  =TK_AND );.     
1dcf0 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d   assert( TK_OR==
1dd00 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20  OP_Or );        
1dd10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dd20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20  op==TK_OR );.   
1dd30 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c     assert( TK_PL
1dd40 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20  US==OP_Add );   
1dd50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1dd60 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b  ( op==TK_PLUS );
1dd70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1dd80 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74  K_MINUS==OP_Subt
1dd90 72 61 63 74 20 29 3b 20 20 20 20 20 74 65 73 74  ract );     test
1dda0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e  case( op==TK_MIN
1ddb0 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  US );.      asse
1ddc0 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52  rt( TK_REM==OP_R
1ddd0 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20  emainder );     
1dde0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ddf0 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61  K_REM );.      a
1de00 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44  ssert( TK_BITAND
1de10 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20  ==OP_BitAnd );  
1de20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1de30 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20  ==TK_BITAND );. 
1de40 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1de50 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20  BITOR==OP_BitOr 
1de60 29 3b 20 20 20 20 20 20 20 20 74 65 73 74 63 61  );        testca
1de70 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52  se( op==TK_BITOR
1de80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1de90 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44  ( TK_SLASH==OP_D
1dea0 69 76 69 64 65 20 29 3b 20 20 20 20 20 20 20 74  ivide );       t
1deb0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1dec0 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61  SLASH );.      a
1ded0 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54  ssert( TK_LSHIFT
1dee0 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29  ==OP_ShiftLeft )
1def0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1df00 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20  ==TK_LSHIFT );. 
1df10 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1df20 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  RSHIFT==OP_Shift
1df30 52 69 67 68 74 20 29 3b 20 20 74 65 73 74 63 61  Right );  testca
1df40 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46  se( op==TK_RSHIF
1df50 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
1df60 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50  t( TK_CONCAT==OP
1df70 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20  _Concat );      
1df80 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1df90 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20  _CONCAT );.     
1dfa0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1dfb0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1dfc0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1dfd0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1dfe0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1dff0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e000 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1e010 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1e020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e030 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c  ddOp3(v, op, r2,
1e040 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
1e050 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1e060 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1e070 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1e080 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1e090 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e0a0 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
1e0b0 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  S: {.      Expr 
1e0c0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
1e0d0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73  pLeft;.      ass
1e0e0 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
1e0f0 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
1e100 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
1e110 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74  .        codeInt
1e120 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65  eger(pParse, pLe
1e130 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  ft, 1, target);.
1e140 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1e150 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53  arget;.#ifndef S
1e160 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1e170 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
1e180 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d  }else if( pLeft-
1e190 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
1e1a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e1b0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e1c0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1e1d0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
1e1e0 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65   codeReal(v, pLe
1e1f0 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c  ft->u.zToken, 1,
1e200 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e210 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e220 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
1e230 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d  lse{.        tem
1e240 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47  pX.op = TK_INTEG
1e250 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  ER;.        temp
1e260 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74  X.flags = EP_Int
1e270 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  Value|EP_TokenOn
1e280 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  ly;.        temp
1e290 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a  X.u.iValue = 0;.
1e2a0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1e2b0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e2c0 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c  (pParse, &tempX,
1e2d0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1e2e0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1e2f0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e300 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e310 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ft, &regFree2);.
1e320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e330 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1e340 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31  Subtract, r2, r1
1e350 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e360 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1e370 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1e380 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1e390 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e3a0 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
1e3b0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
1e3c0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
1e3d0 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
1e3e0 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1e3f0 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b  op==TK_BITNOT );
1e400 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e410 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b  K_NOT==OP_Not );
1e420 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1e430 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b  e( op==TK_NOT );
1e440 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1e450 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e460 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e470 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1e480 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e490 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1e4a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e4b0 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
1e4c0 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  r1, inReg);.    
1e4d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e4e0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
1e4f0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
1e500 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
1e510 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
1e520 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
1e530 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20  L==OP_IsNull ); 
1e540 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e550 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
1e560 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1e570 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
1e580 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f  l ); testcase( o
1e590 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
1e5a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e5b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1e5c0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
1e5d0 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  t);.      r1 = s
1e5e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e5f0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e600 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1e610 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
1e620 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1e630 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
1e640 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e650 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20  p1(v, op, r1);. 
1e660 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1e670 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
1e680 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
1e690 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1e6a0 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
1e6b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e6c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1e6d0 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74  teger, 0, target
1e6e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e6f0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1e700 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65  addr);.      bre
1e710 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1e720 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
1e730 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  ON: {.      AggI
1e740 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78  nfo *pInfo = pEx
1e750 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
1e760 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30      if( pInfo==0
1e770 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1e780 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e790 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1e7a0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1e7b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1e7c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
1e7d0 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
1e7e0 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e  : %s()", pExpr->
1e7f0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1e800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e810 72 65 74 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46  return pInfo->aF
1e820 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  unc[pExpr->iAgg]
1e830 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  .iMem;.      }. 
1e840 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e850 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  }.    case TK_FU
1e860 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
1e870 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b  ExprList *pFarg;
1e880 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1e890 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
1e8a0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
1e8b0 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20  t nFarg;        
1e8c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e8d0 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
1e8e0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75  ents */.      Fu
1e8f0 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
1e900 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
1e910 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20  tion definition 
1e920 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20  object */.      
1e930 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
1e940 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
1e950 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
1e960 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d 61       u32 constMa
1e970 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d  sk = 0;     /* M
1e980 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ask of function 
1e990 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61  arguments that a
1e9a0 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20  re constant */. 
1e9b0 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1e9d0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1e9e0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
1e9f0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
1ea00 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1ea10 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1ea20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
1ea30 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  (db);      /* Th
1ea40 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
1ea50 75 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74  used by this dat
1ea60 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
1ea70 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1ea80 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61  0;    /* A colla
1ea90 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
1eaa0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
1eab0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1eac0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1ead0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
1eae0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1eaf0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
1eb00 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
1eb10 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20     pFarg = 0;.  
1eb20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eb30 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72     pFarg = pExpr
1eb40 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
1eb50 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d   }.      nFarg =
1eb60 20 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e   pFarg ? pFarg->
1eb70 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20  nExpr : 0;.     
1eb80 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1eb90 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1eba0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1ebb0 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78  .      zId = pEx
1ebc0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1ebd0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
1ebe0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
1ebf0 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65  b, zId, nFarg, e
1ec00 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  nc, 0);.#ifdef S
1ec10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b  QLITE_ENABLE_UNK
1ec20 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f  NOWN_SQL_FUNCTIO
1ec30 4e 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  N.      if( pDef
1ec40 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65  ==0 && pParse->e
1ec50 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
1ec60 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
1ec70 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
1ec80 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72   "unknown", nFar
1ec90 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  g, enc, 0);.    
1eca0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1ecb0 20 69 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20   if( pDef==0 || 
1ecc0 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21  pDef->xFinalize!
1ecd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1ece0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1ecf0 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66  arse, "unknown f
1ed00 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20  unction: %s()", 
1ed10 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  zId);.        br
1ed20 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
1ed30 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61      /* Attempt a
1ed40 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e   direct implemen
1ed50 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  tation of the bu
1ed60 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28  ilt-in COALESCE(
1ed70 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49  ) and.      ** I
1ed80 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e  FNULL() function
1ed90 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20  s.  This avoids 
1eda0 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c  unnecessary eval
1edb0 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20  uation of.      
1edc0 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  ** arguments pas
1edd0 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  t the first non-
1ede0 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20  NULL argument.. 
1edf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1ee00 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
1ee10 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
1ee20 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20  COALESCE ){.    
1ee30 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65      int endCoale
1ee40 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  sce = sqlite3Vdb
1ee50 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1ee60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1ee70 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20  Farg>=2 );.     
1ee80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1ee90 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  de(pParse, pFarg
1eea0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
1eeb0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66  rget);.        f
1eec0 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b  or(i=1; i<nFarg;
1eed0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1eee0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1eef0 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p2(v, OP_NotNull
1ef00 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61  , target, endCoa
1ef10 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
1ef20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1ef30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1ef40 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
1ef50 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61 72 67  ove(pParse, targ
1ef60 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  et, 1);.        
1ef70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ef80 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1ef90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1efa0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1efb0 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
1efc0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1efd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1efe0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1eff0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  se);.        }. 
1f000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1f010 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1f020 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
1f030 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1f040 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1f050 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20   The UNLIKELY() 
1f060 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1f070 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74  -op.  The result
1f080 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20   is the value.  
1f090 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1f0a0 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  rst argument..  
1f0b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1f0c0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
1f0d0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55   & SQLITE_FUNC_U
1f0e0 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20  NLIKELY ){.     
1f0f0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
1f100 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72  >=1 );.        r
1f110 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
1f120 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1f130 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
1f140 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1f150 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
1f160 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b  or(i=0; i<nFarg;
1f170 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
1f180 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74  f( i<32 && sqlit
1f190 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1f1a0 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78  (pFarg->a[i].pEx
1f1b0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
1f1c0 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31   testcase( i==31
1f1d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
1f1e0 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42  nstMask |= MASKB
1f1f0 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20  IT32(i);.       
1f200 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
1f210 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1f220 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
1f230 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70  EDCOLL)!=0 && !p
1f240 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
1f250 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1f260 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1f270 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
1f280 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
1f290 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1f2a0 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20   if( pFarg ){.  
1f2b0 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d        if( constM
1f2c0 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ask ){.         
1f2d0 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d   r1 = pParse->nM
1f2e0 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  em+1;.          
1f2f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1f300 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d  nFarg;.        }
1f310 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f320 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
1f330 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1f340 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20   nFarg);.       
1f350 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
1f360 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20  or length() and 
1f370 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f  typeof() functio
1f380 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e  ns with a column
1f390 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20   argument,.     
1f3a0 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35     ** set the P5
1f3b0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
1f3c0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  e OP_Column opco
1f3d0 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e  de to OPFLAG_LEN
1f3e0 47 54 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a  GTHARG.        *
1f3f0 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45  * or OPFLAG_TYPE
1f400 4f 46 41 52 47 20 72 65 73 70 65 63 74 69 76 65  OFARG respective
1f410 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ly, to avoid unn
1f420 65 63 65 73 73 61 72 79 20 64 61 74 61 0a 20 20  ecessary data.  
1f430 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67        ** loading
1f440 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1f450 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
1f460 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c  funcFlags & (SQL
1f470 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c  ITE_FUNC_LENGTH|
1f480 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
1f490 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  OF))!=0 ){.     
1f4a0 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a       u8 exprOp;.
1f4b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1f4c0 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
1f4d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f4e0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
1f4f0 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
1f500 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67    exprOp = pFarg
1f510 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
1f520 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1f530 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  exprOp==TK_COLUM
1f540 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f  N || exprOp==TK_
1f550 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
1f560 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1f570 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45  ( SQLITE_FUNC_LE
1f580 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e  NGTH==OPFLAG_LEN
1f590 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
1f5a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
1f5b0 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
1f5c0 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  ==OPFLAG_TYPEOFA
1f5d0 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
1f5e0 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 66    testcase( pDef
1f5f0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50  ->funcFlags & OP
1f600 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
1f610 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ;.            pF
1f620 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
1f630 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20  >op2 = .        
1f640 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e            pDef->
1f650 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46  funcFlags & (OPF
1f660 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50  LAG_LENGTHARG|OP
1f670 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b  FLAG_TYPEOFARG);
1f680 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f690 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1f6a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f6b0 50 75 73 68 28 70 50 61 72 73 65 29 3b 20 20 20  Push(pParse);   
1f6c0 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32    /* Ticket 2ea2
1f6d0 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20  425d34be */.    
1f6e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f6f0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
1f700 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 30  se, pFarg, r1, 0
1f710 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55    SQLITE_ECEL_DU
1f740 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  P|SQLITE_ECEL_FA
1f750 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20 20 73  CTOR);.        s
1f760 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1f770 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  op(pParse);     
1f780 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34   /* Ticket 2ea24
1f790 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20  25d34be */.     
1f7a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f7b0 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  r1 = 0;.      }.
1f7c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f7d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1f7e0 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62  .      /* Possib
1f7f0 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20  ly overload the 
1f800 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20  function if the 
1f810 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1f820 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72  s.      ** a vir
1f830 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d  tual table colum
1f840 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
1f850 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66    ** For infix f
1f860 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20  unctions (LIKE, 
1f870 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e  GLOB, REGEXP, an
1f880 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65  d MATCH) use the
1f890 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64  .      ** second
1f8a0 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74   argument, not t
1f8b0 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65  he first, as the
1f8c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73   argument to tes
1f8d0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  t to.      ** se
1f8e0 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c  e if it is a col
1f8f0 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c  umn in a virtual
1f900 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
1f910 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20   done because.  
1f920 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20      ** the left 
1f930 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78  operand of infix
1f940 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20   functions (the 
1f950 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20  operand we want 
1f960 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  to.      ** cont
1f970 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29  rol overloading)
1f980 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20   ends up as the 
1f990 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1f9a0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
1f9b0 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65  function.  The e
1f9c0 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f  xpression "A glo
1f9d0 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65  b B" is equivale
1f9e0 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  nt to .      ** 
1f9f0 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20  "glob(B,A).  We 
1fa00 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20  want to use the 
1fa10 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  A in "A glob B" 
1fa20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a  to test.      **
1fa30 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76   for function ov
1fa40 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20  erloading.  But 
1fa50 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72  we use the B ter
1fa60 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22  m in "glob(B,A)"
1fa70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1fa80 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26   if( nFarg>=2 &&
1fa90 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
1faa0 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29   EP_InfixFunc) )
1fab0 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
1fac0 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
1fad0 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
1fae0 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
1faf0 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  arg->a[1].pExpr)
1fb00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1fb10 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20  ( nFarg>0 ){.   
1fb20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
1fb30 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
1fb40 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
1fb50 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
1fb60 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
1fb70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1fb80 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
1fb90 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1fba0 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
1fbb0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
1fbc0 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
1fbd0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
1fbe0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fbf0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
1fc00 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
1fc10 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
1fc20 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
1fc30 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1fc40 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1fc50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 63 6f 6e 73  _Function0, cons
1fc60 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65  tMask, r1, targe
1fc70 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1fc80 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1fc90 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44  *)pDef, P4_FUNCD
1fca0 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EF);.      sqlit
1fcb0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1fcc0 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20  , (u8)nFarg);.  
1fcd0 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 26 26      if( nFarg &&
1fce0 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b   constMask==0 ){
1fcf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fd00 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1fd10 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61  (pParse, r1, nFa
1fd20 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
1fd30 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1fd40 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1fd50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1fd60 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
1fd70 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
1fd80 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
1fd90 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
1fda0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1fdb0 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
1fdc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fdd0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
1fde0 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
1fdf0 4b 5f 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f  K_SELECT && (nCo
1fe00 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
1fe10 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
1fe20 78 70 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20  xpr)!=1 ){.     
1fe30 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
1fe40 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
1fe50 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20   nCol, 1);.     
1fe60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fe70 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6f  return sqlite3Co
1fe80 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
1fe90 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
1fea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1feb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1fec0 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f   case TK_SELECT_
1fed0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1fee0 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
1fef0 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ->iTable==0 ){. 
1ff00 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
1ff10 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71  eft->iTable = sq
1ff20 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
1ff30 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
1ff40 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a  ->pLeft, 0, 0);.
1ff50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1ff60 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  turn pExpr->pLef
1ff70 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70  t->iTable + pExp
1ff80 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
1ff90 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
1ffa0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
1ffb0 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
1ffc0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1ffd0 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  (v);.      int d
1ffe0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
1fff0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
20000 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
20010 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20020 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
20030 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
20040 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
20050 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
20060 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e  IfFalse, destIfN
20070 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
20080 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20090 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
200a0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
200b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
200c0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
200d0 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71  False);.      sq
200e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
200f0 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61  v, OP_AddImm, ta
20100 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  rget, 0);.      
20110 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
20120 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
20130 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65  fNull);.      re
20140 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
20150 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
20160 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
20170 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20  Y */...    /*.  
20180 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
20190 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
201a0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
201b0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
201c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
201d0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
201e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
201f0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
20200 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
20210 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
20220 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
20230 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
20240 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
20250 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
20260 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
20270 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
20280 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78 70 72  EN: {.      expr
20290 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
202a0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
202b0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
202c0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
202d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
202e0 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65 20  _SPAN:.    case 
202f0 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20  TK_COLLATE: .   
20300 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
20310 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
20320 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
20330 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
20340 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
20350 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  t);.    }..    c
20360 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20  ase TK_TRIGGER: 
20370 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
20380 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54  e opcode is TK_T
20390 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65  RIGGER, then the
203a0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
203b0 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20   reference.     
203c0 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20   ** to a column 
203d0 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20  in the new.* or 
203e0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
203f0 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  les available to
20400 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65  .      ** trigge
20410 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74  r programs. In t
20420 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54  his case Expr.iT
20430 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31  able is set to 1
20440 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a   for the.      *
20450 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  * new.* pseudo-t
20460 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74  able, or 0 for t
20470 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
20480 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c  table. Expr.iCol
20490 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  umn.      ** is 
204a0 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  set to the colum
204b0 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  n of the pseudo-
204c0 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f  table to read, o
204d0 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20  r to -1 to.     
204e0 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77   ** read the row
204f0 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  id field..      
20500 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
20510 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d  expression is im
20520 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
20530 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f  an OP_Param opco
20540 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20  de. The p1.     
20550 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73   ** parameter is
20560 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e   set to 0 for an
20570 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72   old.rowid refer
20580 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31  ence, or to (i+1
20590 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  ).      ** to re
205a0 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20  ference another 
205b0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c  column of the ol
205c0 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
205d0 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a  , where .      *
205e0 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78  * i is the index
205f0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
20600 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20  For a new.rowid 
20610 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73  reference, p1 is
20620 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f  .      ** set to
20630 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20   (n+1), where n 
20640 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
20650 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68   columns in each
20660 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20   pseudo-table.. 
20670 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65       ** For a re
20680 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f  ference to any o
20690 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ther column in t
206a0 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  he new.* pseudo-
206b0 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20  table, p1.      
206c0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b  ** is set to (n+
206d0 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e  2+i), where n an
206e0 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e  d i are as defin
206f0 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46  ed previously. F
20700 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d  or.      ** exam
20710 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  ple, if the tabl
20720 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67  e on which trigg
20730 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69  ers are being fi
20740 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  red is.      ** 
20750 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20  declared as:.   
20760 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
20770 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
20780 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a  (a, b);.      **
20790 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70  .      ** Then p
207a0 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  1 is interpreted
207b0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
207c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
207d0 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f   p1==0   ->    o
207e0 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d  ld.rowid     p1=
207f0 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72  =3   ->    new.r
20800 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20  owid.      **   
20810 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==1   ->    ol
20820 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.a         p1==
20830 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a  4   ->    new.a.
20840 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32        **   p1==2
20850 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20     ->    old.b  
20860 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d         p1==5   -
20870 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20  >    new.b      
20880 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
20890 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
208a0 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
208b0 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72    int p1 = pExpr
208c0 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62  ->iTable * (pTab
208d0 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20  ->nCol+1) + 1 + 
208e0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
208f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20900 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Expr->iTable==0 
20910 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
20920 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==1 );.      ass
20930 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
20940 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72  umn>=-1 && pExpr
20950 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e  ->iColumn<pTab->
20960 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  nCol );.      as
20970 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65  sert( pTab->iPKe
20980 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43  y<0 || pExpr->iC
20990 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b  olumn!=pTab->iPK
209a0 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ey );.      asse
209b0 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c  rt( p1>=0 && p1<
209c0 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29  (pTab->nCol*2+2)
209d0 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74   );..      sqlit
209e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
209f0 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61  OP_Param, p1, ta
20a00 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  rget);.      Vdb
20a10 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
20a20 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20  .%s -> $%d",.   
20a30 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61       (pExpr->iTa
20a40 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f  ble ? "new" : "o
20a50 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70  ld"),.        (p
20a60 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
20a70 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70  ? "rowid" : pExp
20a80 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  r->pTab->aCol[pE
20a90 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e  xpr->iColumn].zN
20aa0 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61  ame),.        ta
20ab0 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a  rget.      ));..
20ac0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20ad0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
20ae0 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  NT.      /* If t
20af0 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45  he column has RE
20b00 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20  AL affinity, it 
20b10 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
20b20 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20   stored as an.  
20b30 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
20b40 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  Use OP_RealAffin
20b50 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ity to make sure
20b60 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
20b70 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  al..      **.   
20b80 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
20b90 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32  F: R-60985-57662
20ba0 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e   SQLite will con
20bb0 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62  vert the value b
20bc0 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ack to.      ** 
20bd0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77  floating point w
20be0 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69  hen extracting i
20bf0 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72  t from the recor
20c00 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
20c10 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
20c20 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54  =0 .       && pT
20c30 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
20c40 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
20c50 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
20c60 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  AL.      ){.    
20c70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20c80 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
20c90 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74  Affinity, target
20ca0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
20cb0 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
20cc0 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
20cd0 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20  K_VECTOR: {.    
20ce0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
20cf0 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
20d00 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
20d10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20d20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
20d30 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
20d40 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
20d50 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
20d60 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
20d70 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
20d80 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
20d90 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
20da0 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
20db0 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
20dc0 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
20dd0 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
20de0 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
20df0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
20e00 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
20e10 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
20e20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
20e30 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
20e40 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
20e50 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
20e60 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
20e70 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
20e80 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
20e90 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
20ea0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
20eb0 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
20ec0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
20ed0 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
20ee0 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
20ef0 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t of pExpr->x.pL
20f00 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e  ist if pExpr->x.
20f10 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a  pList->nExpr is.
20f20 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65      ** odd.  The
20f30 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
20f40 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d  nal.  If the num
20f50 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
20f60 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a  in x.pList.    *
20f70 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20  * is even, then 
20f80 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64  Y is omitted and
20f90 20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22   the "otherwise"
20fa0 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
20fb0 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e  .    ** Ei is in
20fc0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
20fd0 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20  [i*2] and Ri is 
20fe0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
20ff0 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20  i*2+1]..    **. 
21000 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74     ** The result
21010 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
21020 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72  on is the Ri for
21030 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
21040 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f  ing Ei,.    ** o
21050 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
21060 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68   matching Ei, th
21070 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f  e ELSE term Y, o
21080 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  r if there is.  
21090 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72    ** no ELSE ter
210a0 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  m, NULL..    */.
210b0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
210c0 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45  ert( op==TK_CASE
210d0 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
210e0 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21100 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
21110 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
21120 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
21130 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
21140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
21150 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
21160 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
21170 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
21180 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
21190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
211a0 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
211b0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
211c0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211e0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
211f0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
21200 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
21210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
21220 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
21230 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
21240 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
21250 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
21260 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
21270 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
21280 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
212a0 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
212b0 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
212c0 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73   /* The X expres
212f0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
21300 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20  pr *pTest = 0;  
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21320 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41  /* X==Ei (form A
21330 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f  ) or just Ei (fo
21340 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56  rm B) */.      V
21350 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61  VA_ONLY( int iCa
21360 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  cheLevel = pPars
21370 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20  e->iCacheLevel; 
21380 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  )..      assert(
21390 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
213a0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
213b0 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d  elect) && pExpr-
213c0 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20  >x.pList );.    
213d0 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
213e0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  x.pList->nExpr >
213f0 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
21400 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
21410 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
21420 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
21430 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
21440 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
21450 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73      endLabel = s
21460 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
21470 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
21480 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  ( (pX = pExpr->p
21490 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
214a0 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b      tempX = *pX;
214b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
214c0 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
214d0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
214e0 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
214f0 74 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56  tempX, exprCodeV
21500 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74  ector(pParse, &t
21510 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
21520 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
21530 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
21540 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   );.        mems
21550 65 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30  et(&opCompare, 0
21560 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61  , sizeof(opCompa
21570 72 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  re));.        op
21580 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f  Compare.op = TK_
21590 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  EQ;.        opCo
215a0 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74  mpare.pLeft = &t
215b0 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54  empX;.        pT
215c0 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65  est = &opCompare
215d0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63  ;.        /* Tic
215e0 6b 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35  ket b351d95f9cd5
215f0 65 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35  ef17e9d9dbae18f5
21600 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20  ca8611190001:.  
21610 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c        ** The val
21620 75 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d  ue in regFree1 m
21630 69 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65  ight get SCopy-e
21640 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20  d into the file 
21650 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20  result..        
21660 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  ** So make sure 
21670 74 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65  that the regFree
21680 31 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  1 register is no
21690 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68  t reused for oth
216a0 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75  er.        ** pu
216b0 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69  rposes and possi
216c0 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  bly overwritten.
216d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67    */.        reg
216e0 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20  Free1 = 0;.     
216f0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
21700 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69  ; i<nExpr-1; i=i
21710 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2){.        sql
21720 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
21730 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
21740 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20     if( pX ){.   
21750 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
21760 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Test!=0 );.     
21770 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
21780 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65  Right = aListele
21790 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  m[i].pExpr;.    
217a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
217b0 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69       pTest = aLi
217c0 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
217d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
217e0 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71     nextCase = sq
217f0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
21800 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  el(v);.        t
21810 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e  estcase( pTest->
21820 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
21830 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21840 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
21850 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43  se, pTest, nextC
21860 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ase, SQLITE_JUMP
21870 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  IFNULL);.       
21880 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74   testcase( aList
21890 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d  elem[i+1].pExpr-
218a0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
218b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
218c0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
218d0 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
218e0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
218f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21900 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c  VdbeGoto(v, endL
21910 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  abel);.        s
21920 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
21930 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
21940 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21950 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
21960 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
21970 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78  }.      if( (nEx
21980 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  pr&1)!=0 ){.    
21990 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
219a0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
219b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
219c0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
219d0 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70  , pEList->a[nExp
219e0 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  r-1].pExpr, targ
219f0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
21a00 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
21a10 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
21a20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
21a30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21a40 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
21a50 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
21a60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21a70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
21a80 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
21a90 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20  e->nErr>0 .     
21aa0 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
21ab0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43  >iCacheLevel==iC
21ac0 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20  acheLevel );.   
21ad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
21ae0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
21af0 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62  dLabel);.      b
21b00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
21b10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21b20 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65  TRIGGER.    case
21b30 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
21b40 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
21b50 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52  ->affinity==OE_R
21b60 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20  ollback .       
21b70 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
21b80 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
21b90 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
21ba0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
21bb0 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20  OE_Fail.        
21bc0 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
21bd0 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
21be0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
21bf0 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72  if( !pParse->pTr
21c00 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20  iggerTab ){.    
21c10 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
21c20 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c40 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
21c50 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
21c60 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
21c70 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
21c80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
21c90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
21ca0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
21cb0 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
21cc0 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
21cd0 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
21ce0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
21cf0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
21d00 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
21d10 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69  alue) );.      i
21d20 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
21d30 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b  ty==OE_Ignore ){
21d40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21d50 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
21d60 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61          v, OP_Ha
21d70 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f  lt, SQLITE_OK, O
21d80 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78  E_Ignore, 0, pEx
21d90 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b  pr->u.zToken,0);
21da0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
21db0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
21dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
21dd0 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
21de0 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c  aint(pParse, SQL
21df0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
21e00 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20  RIGGER,.        
21e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
21e30 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e  inity, pExpr->u.
21e40 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20  zToken, 0, 0);. 
21e50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72       }..      br
21e60 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
21e70 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  f.  }.  sqlite3R
21e80 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
21e90 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
21ea0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
21eb0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
21ec0 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65   regFree2);.  re
21ed0 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f  turn inReg;.}../
21ee0 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20  *.** Factor out 
21ef0 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20  the code of the 
21f00 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
21f10 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69   to initializati
21f20 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  on time..*/.void
21f30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21f40 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20  AtInit(.  Parse 
21f50 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
21f60 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
21f70 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
21f80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
21f90 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20  ression to code 
21fa0 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e  when the VDBE in
21fb0 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69  itializes */.  i
21fc0 6e 74 20 72 65 67 44 65 73 74 2c 20 20 20 20 20  nt regDest,     
21fd0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61   /* Store the va
21fe0 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
21ff0 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 75  ster */.  u8 reu
22000 73 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20 54  sable       /* T
22010 72 75 65 20 69 66 20 74 68 69 73 20 65 78 70 72  rue if this expr
22020 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61 62  ession is reusab
22030 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  le */.){.  ExprL
22040 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  ist *p;.  assert
22050 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
22060 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d  pParse) );.  p =
22070 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
22080 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 73  xpr;.  pExpr = s
22090 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
220a0 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
220b0 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   0);.  p = sqlit
220c0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
220d0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70  (pParse, p, pExp
220e0 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  r);.  if( p ){. 
220f0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
22100 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
22110 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  = &p->a[p->nExpr
22120 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  -1];.     pItem-
22130 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
22140 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20 20   = regDest;.    
22150 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
22160 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20 7d   = reusable;.  }
22170 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  .  pParse->pCons
22180 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  tExpr = p;.}../*
22190 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
221a0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  e to evaluate an
221b0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
221c0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
221d0 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69  s.** into a regi
221e0 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ster.  Return th
221f0 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
22200 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75  r where the resu
22210 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  lts.** are store
22220 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
22230 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
22240 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
22250 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61   that can be dea
22260 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65  llocated,.** the
22270 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62  n write its numb
22280 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20  er into *pReg.  
22290 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
222a0 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a  gister is not.**
222b0 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68   a temporary, th
222c0 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20  en set *pReg to 
222d0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  zero..**.** If p
222e0 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61  Expr is a consta
222f0 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
22300 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65  utine might gene
22310 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64  rate this.** cod
22320 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65  e to fill the re
22330 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e  gister in the in
22340 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63  itialization sec
22350 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56  tion of the.** V
22360 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20  DBE program, in 
22370 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20  order to factor 
22380 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76  it out of the ev
22390 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a  aluation loop..*
223a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
223b0 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20  rCodeTemp(Parse 
223c0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
223d0 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29  Expr, int *pReg)
223e0 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45  {.  int r2;.  pE
223f0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
22400 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78  rSkipCollate(pEx
22410 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74  pr);.  if( Const
22420 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
22430 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  .   && pExpr->op
22440 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20  !=TK_REGISTER.  
22450 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
22460 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
22470 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20  (pExpr).  ){.   
22480 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 70   ExprList *p = p
22490 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
224a0 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  r;.    int i;.  
224b0 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20    *pReg  = 0;.  
224c0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
224d0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
224e0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
224f0 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d      for(pItem=p-
22500 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20  >a, i=p->nExpr; 
22510 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d  i>0; pItem++, i-
22520 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -){.        if( 
22530 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
22540 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
22550 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
22560 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20  pr,pExpr,-1)==0 
22570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
22580 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f  urn pItem->u.iCo
22590 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20  nstExprReg;.    
225a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
225b0 20 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b 70    }.    r2 = ++p
225c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
225d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
225e0 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
225f0 45 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20 20  Expr, r2, 1);.  
22600 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
22610 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
22620 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
22630 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
22640 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
22650 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
22660 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31  ;.    if( r2==r1
22670 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20   ){.      *pReg 
22680 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = r1;.    }else{
22690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
226a0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
226b0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
226c0 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  *pReg = 0;.    }
226d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
226e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
226f0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
22700 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
22710 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
22720 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
22730 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
22740 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
22750 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
22760 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
22770 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
22780 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  arget..*/.void s
22790 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
227a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
227b0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
227c0 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
227d0 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
227e0 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
227f0 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
22800 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
22810 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
22820 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
22830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22840 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
22850 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
22860 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
22870 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22880 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
22890 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
228a0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
228b0 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
228c0 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
228d0 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
228e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
228f0 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
22900 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
22910 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
22920 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22930 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
22940 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
22950 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
22960 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
22970 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74  Make a transient
22980 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
22990 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68  ion pExpr and th
229a0 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67  en code it using
229b0 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43  .** sqlite3ExprC
229c0 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75  ode().  This rou
229d0 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20  tine works just 
229e0 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
229f0 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74  Code().** except
22a00 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20   that the input 
22a10 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75  expression is gu
22a20 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75  aranteed to be u
22a30 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
22a40 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
22a50 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61  eCopy(Parse *pPa
22a60 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
22a70 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
22a80 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
22a90 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78  Parse->db;.  pEx
22aa0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
22ab0 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
22ac0 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  );.  if( !db->ma
22ad0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c  llocFailed ) sql
22ae0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
22af0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
22b00 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  et);.  sqlite3Ex
22b10 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
22b20 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  pr);.}../*.** Ge
22b30 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
22b40 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
22b50 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
22b60 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
22b70 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
22b80 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
22b90 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
22ba0 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
22bb0 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
22bc0 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68  r target.  If th
22bd0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
22be0 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
22bf0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
22c00 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63  ight choose to c
22c10 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ode the expressi
22c20 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61  on at initializa
22c30 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f  tion time..*/.vo
22c40 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
22c50 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72  deFactorable(Par
22c60 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
22c70 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
22c80 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72  get){.  if( pPar
22c90 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
22ca0 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  r && sqlite3Expr
22cb0 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
22cc0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
22cd0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
22ce0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
22cf0 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  rget, 0);.  }els
22d00 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
22d10 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
22d20 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
22d30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
22d40 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65  rate code that e
22d50 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69 76  valuates the giv
22d60 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
22d70 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c  d puts the resul
22d80 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  t.** in register
22d90 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   target..**.** A
22da0 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  lso make a copy 
22db0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
22dc0 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  n results into a
22dd0 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72  nother "cache" r
22de0 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d  egister.** and m
22df0 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73  odify the expres
22e00 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65  sion so that the
22e10 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
22e20 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74   evaluated,.** t
22e30 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
22e40 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65  opy of the cache
22e50 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
22e60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
22e70 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73   used for expres
22e80 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  sions that are u
22e90 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  sed multiple .**
22ea0 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72   times.  They ar
22eb0 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  e evaluated once
22ec0 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73   and the results
22ed0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
22ee0 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64  on.** are reused
22ef0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22f00 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68  3ExprCodeAndCach
22f10 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
22f20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
22f30 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
22f40 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
22f50 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d  Vdbe;.  int iMem
22f60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
22f70 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  get>0 );.  asser
22f80 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
22f90 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73  _REGISTER );.  s
22fa0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
22fb0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
22fc0 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20  rget);.  iMem = 
22fd0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
22fe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22ff0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
23000 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20  target, iMem);. 
23010 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
23020 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a  pExpr, iMem);.}.
23030 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
23040 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
23050 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
23060 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
23070 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
23080 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f  ession list into
23090 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
230a0 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
230b0 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a  ng at target..**
230c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
230d0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
230e0 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a  s evaluated..**.
230f0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
23100 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76  EL_DUP flag prev
23110 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e  ents the argumen
23120 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ts from being.**
23130 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50   filled using OP
23140 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79  _SCopy.  OP_Copy
23150 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e   must be used in
23160 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stead..**.** The
23170 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
23180 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c  TOR argument all
23190 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ows constant arg
231a0 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20  uments to be.** 
231b0 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74  factored out int
231c0 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
231d0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
231e0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
231f0 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74   flag means that
23200 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
23210 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a  the list with.**
23220 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e   ExprList.a[].u.
23230 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
23240 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
23250 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  n evaluated and 
23260 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67  stored.** in reg
23270 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65 67  isters at srcReg
23280 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c  , and so the val
23290 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64  ue can be copied
232a0 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f 0a   from there..*/.
232b0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
232c0 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50  odeExprList(.  P
232d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
232e0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
232f0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
23300 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
23310 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
23320 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ist to be coded 
23330 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c  */.  int target,
23340 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
23350 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74   to write result
23360 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52 65  s */.  int srcRe
23370 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75  g,        /* Sou
23380 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69 66  rce registers if
23390 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
233a0 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20   */.  u8 flags  
233b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
233c0 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20  TE_ECEL_* flags 
233d0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
233e0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
233f0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  tem;.  int i, j,
23400 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20   n;.  u8 copyOp 
23410 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23420 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50  E_ECEL_DUP) ? OP
23430 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79  _Copy : OP_SCopy
23440 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
23450 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
23460 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
23470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  );.  assert( tar
23480 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  get>0 );.  asser
23490 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
234a0 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72  !=0 );  /* Never
234b0 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20 6f   gets this far o
234c0 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20  therwise */.  n 
234d0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
234e0 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74    if( !ConstFact
234f0 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66  orOk(pParse) ) f
23500 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
23510 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66  ECEL_FACTOR;.  f
23520 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
23530 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  a, i=0; i<n; i++
23540 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
23550 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49  Expr *pExpr = pI
23560 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
23570 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
23580 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30  ITE_ECEL_REF)!=0
23590 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e   && (j = pItem->
235a0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
235b0 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
235c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
235d0 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20  CEL_OMITREF ){. 
235e0 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20         i--;.    
235f0 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
23600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
23610 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23620 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63  v, copyOp, j+src
23630 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29  Reg-1, target+i)
23640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
23650 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
23660 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
23670 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74  TOR)!=0 && sqlit
23680 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
23690 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
236a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
236b0 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
236c0 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 2c 20  Expr, target+i, 
236d0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
236e0 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d       int inReg =
236f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23700 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
23710 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
23720 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
23730 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20  !=target+i ){.  
23740 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
23750 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  p;.        if( c
23760 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20  opyOp==OP_Copy. 
23770 20 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d          && (pOp=
23780 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
23790 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65  (v, -1))->opcode
237a0 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
237b0 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f     && pOp->p1+pO
237c0 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20  p->p3+1==inReg. 
237d0 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
237e0 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61  p2+pOp->p3+1==ta
237f0 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29  rget+i.        )
23800 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
23810 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  >p3++;.        }
23820 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23840 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52  2(v, copyOp, inR
23850 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  eg, target+i);. 
23860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23870 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23880 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
23890 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
238a0 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72  r a BETWEEN oper
238b0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78  ator..**.**    x
238c0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
238d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
238e0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
238f0 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79  o .**.**    x>=y
23900 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20   AND x<=z.**.** 
23910 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c  Code it as such,
23920 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
23930 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75  do the common su
23940 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65  bexpression.** e
23950 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e  limination of x.
23960 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70  .**.** The xJump
23970 49 66 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  If parameter det
23980 65 72 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a  ermines details:
23990 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20  .**.**    NULL: 
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239b0 20 20 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c    Store the bool
239c0 65 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65  ean result in re
239d0 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71  g[dest].**    sq
239e0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 3a  lite3ExprIfTrue:
239f0 20 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65        Jump to de
23a00 73 74 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20  st if true.**   
23a10 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
23a20 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f  lse:     Jump to
23a30 20 64 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a   dest if false.*
23a40 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e  *.** The jumpIfN
23a50 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73  ull parameter is
23a60 20 69 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d   ignored if xJum
23a70 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  pIf is NULL..*/.
23a80 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
23a90 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50  CodeBetween(.  P
23aa0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
23ab0 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
23ac0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
23ad0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
23ae0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
23af0 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78  * The BETWEEN ex
23b00 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
23b10 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
23b20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
23b30 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c  ion or storage l
23b40 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  ocation */.  voi
23b50 64 20 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65  d (*xJump)(Parse
23b60 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29  *,Expr*,int,int)
23b70 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74  , /* Action to t
23b80 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  ake */.  int jum
23b90 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61  pIfNull    /* Ta
23ba0 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
23bb0 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55  he BETWEEN is NU
23bc0 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65  LL */.){. Expr e
23bd0 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54  xprAnd;     /* T
23be0 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
23bf0 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d  in  x>=y AND x<=
23c00 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  z  */.  Expr com
23c10 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65  pLeft;    /* The
23c20 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a    x>=y  term */.
23c30 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
23c40 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a  ;   /* The  x<=z
23c50 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
23c60 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a   exprX;       /*
23c70 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72   The  x  subexpr
23c80 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
23c90 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a  regFree1 = 0; /*
23ca0 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
23cb0 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d  egister */...  m
23cc0 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c  emset(&compLeft,
23cd0 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
23ce0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d  );.  memset(&com
23cf0 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f  pRight, 0, sizeo
23d00 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73  f(Expr));.  mems
23d10 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20  et(&exprAnd, 0, 
23d20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a  sizeof(Expr));..
23d30 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
23d40 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
23d50 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
23d60 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45  );.  exprX = *pE
23d70 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78  xpr->pLeft;.  ex
23d80 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e  prAnd.op = TK_AN
23d90 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65  D;.  exprAnd.pLe
23da0 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a  ft = &compLeft;.
23db0 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74    exprAnd.pRight
23dc0 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20   = &compRight;. 
23dd0 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54   compLeft.op = T
23de0 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  K_GE;.  compLeft
23df0 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
23e00 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67  .  compLeft.pRig
23e10 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
23e20 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
23e30 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20  .  compRight.op 
23e40 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52  = TK_LE;.  compR
23e50 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  ight.pLeft = &ex
23e60 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  prX;.  compRight
23e70 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
23e80 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
23e90 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65  Expr;.  exprToRe
23ea0 67 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 65  gister(&exprX, e
23eb0 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
23ec0 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
23ed0 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28  egFree1));.  if(
23ee0 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a   xJump ){.    xJ
23ef0 75 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  ump(pParse, &exp
23f00 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70  rAnd, dest, jump
23f10 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  IfNull);.  }else
23f20 7b 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68  {.    /* Mark th
23f30 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
23f40 62 65 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f  being from the O
23f50 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
23f60 65 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20  e of a join.    
23f70 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  ** so that the s
23f80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
23f90 72 67 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77  rget() routine w
23fa0 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
23fb0 74 6f 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69  to move.    ** i
23fc0 74 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65  t into the Parse
23fd0 2e 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74  .pConstExpr list
23fe0 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65  .  We should use
23ff0 20 61 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74   a new bit for t
24000 68 69 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  his,.    ** for 
24010 63 6c 61 72 69 74 79 2c 20 62 75 74 20 77 65 20  clarity, but we 
24020 61 72 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20  are out of bits 
24030 69 6e 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67  in the Expr.flag
24040 73 20 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20  s field so we.  
24050 20 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75    ** have to reu
24060 73 65 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  se the EP_FromJo
24070 69 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e  in bit.  Bummer.
24080 20 2a 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c   */.    exprX.fl
24090 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f  ags |= EP_FromJo
240a0 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  in;.    sqlite3E
240b0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
240c0 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
240d0 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dest);.  }.  sql
240e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
240f0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
24100 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75  ee1);..  /* Ensu
24110 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74  re adequate test
24120 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74   coverage */.  t
24130 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
24140 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
24150 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
24160 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
24170 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
24180 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
24190 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
241a0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
241b0 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
241c0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
241d0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
241e0 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
241f0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
24200 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
24210 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
24220 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
24230 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
24240 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
24250 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
24260 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
24270 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
24280 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
24290 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
242a0 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
242b0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
242c0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
242d0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
242e0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
242f0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
24300 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
24310 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
24320 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
24330 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
24340 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
24350 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
24360 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
24370 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
24380 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a   xJump==0 );.}..
24390 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
243a0 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
243b0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
243c0 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
243d0 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
243e0 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
243f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
24400 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
24410 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
24420 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
24430 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
24440 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
24450 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
24460 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
24470 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
24480 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
24490 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
244a0 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
244b0 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
244c0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
244d0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  L..**.** This co
244e0 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
244f0 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
24500 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
24510 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
24520 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
24530 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
24540 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
24550 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
24560 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
24570 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
24580 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
24590 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
245a0 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
245b0 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
245c0 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
245d0 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
245e0 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
245f0 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
24600 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
24610 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
24620 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
24630 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
24640 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
24650 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
24660 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
24670 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
24680 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
24690 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
246a0 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
246b0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
246c0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
246d0 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
246e0 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
246f0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
24700 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
24710 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
24720 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
24730 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e  =0) )     return
24740 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  ;  /* Existence 
24750 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
24760 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
24770 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
24780 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
24790 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e   No way this can
247a0 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20   happen */.  op 
247b0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
247c0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
247d0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
247e0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
247f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
24800 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
24810 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
24820 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
24830 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
24840 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
24850 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49  >pLeft, d2,jumpI
24860 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
24870 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
24880 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
24890 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
248a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
248b0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
248c0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
248d0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
248e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
248f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
24900 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
24910 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
24920 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
24930 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
24940 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
24950 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
24960 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
24970 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24980 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
24990 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
249a0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
249b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
249c0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
249d0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
249e0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
249f0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
24a00 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
24a10 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
24a20 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
24a30 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
24a40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
24a50 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
24a60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
24a70 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
24a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24a90 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
24aa0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
24ab0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
24ac0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
24ad0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
24ae0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
24af0 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
24b00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
24b10 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
24b20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
24b30 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
24b40 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
24b50 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
24b60 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20     jumpIfNull = 
24b70 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
24b80 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
24b90 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  u */.    case TK
24ba0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
24bb0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
24bc0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
24bd0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
24be0 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
24bf0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _EQ: {.      if(
24c00 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
24c10 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  ctor(pExpr->pLef
24c20 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c  t) ) goto defaul
24c30 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65  t_expr;.      te
24c40 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
24c50 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
24c60 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
24c70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
24c80 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
24c90 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
24ca0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
24cb0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
24cc0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
24cd0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
24ce0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
24cf0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
24d00 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
24d10 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
24d20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
24d30 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
24d40 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
24d50 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
24d60 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
24d70 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
24d80 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
24d90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
24da0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
24db0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
24dc0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
24dd0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
24de0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
24df0 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
24e00 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
24e10 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
24e20 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
24e30 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
24e40 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
24e50 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
24e60 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
24e70 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
24e80 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
24e90 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
24ea0 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  (op==OP_Eq);.   
24eb0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
24ec0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
24ed0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
24ee0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
24ef0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
24f00 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
24f10 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
24f20 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
24f30 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
24f40 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
24f50 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  ase(op==OP_Ne);.
24f60 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
24f70 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
24f80 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
24f90 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
24fa0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
24fb0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
24fc0 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
24fd0 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
24fe0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
24ff0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
25000 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25010 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
25020 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25030 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
25040 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
25050 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
25060 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
25070 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
25080 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
25090 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
250a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
250b0 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
250c0 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
250d0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
250e0 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
250f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
25100 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
25110 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
25120 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
25130 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25140 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
25150 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
25160 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
25170 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
25180 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
25190 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
251a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
251b0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
251c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
251d0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
251e0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
251f0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
25200 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
25210 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
25220 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
25230 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
25240 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e  rIfTrue, jumpIfN
25250 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
25260 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
25270 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
25280 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
25290 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
252a0 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
252b0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
252c0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
252d0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
252e0 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73  jumpIfNull ? des
252f0 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b  t : destIfFalse;
25300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25310 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
25320 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
25330 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
25340 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
25350 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
25360 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
25370 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
25380 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
25390 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
253a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
253b0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65  efault: {.    de
253c0 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20  fault_expr:.    
253d0 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
253e0 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
253f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
25400 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
25410 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
25420 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
25430 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
25440 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20     /* No-op */. 
25450 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25460 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
25470 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
25480 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
25490 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
254a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
254b0 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
254c0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
254d0 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  !=0);.        Vd
254e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
254f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
25500 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
25510 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
25520 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
25530 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
25540 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
25550 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
25560 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
25570 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
25580 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
25590 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
255a0 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a  Free2);  .}../*.
255b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
255c0 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
255d0 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
255e0 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
255f0 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
25600 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
25610 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
25620 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
25630 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
25640 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
25650 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
25660 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
25670 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
25680 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
25690 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
256a0 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
256b0 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
256c0 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45  IfNull is SQLITE
256d0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66  _JUMPIFNULL or f
256e0 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
256f0 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20  umpIfNull.** is 
25700 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
25710 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
25720 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
25730 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
25740 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
25750 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
25760 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
25770 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
25780 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
25790 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
257a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
257b0 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
257c0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
257d0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
257e0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
257f0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
25800 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  0) ) return; /* 
25810 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
25820 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
25830 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ler */.  if( pEx
25840 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72  pr==0 )    retur
25850 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
25860 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
25870 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
25880 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
25890 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
258a0 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
258b0 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
258c0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
258d0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
258e0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
258f0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
25900 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
25910 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
25920 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
25930 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
25940 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
25950 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
25960 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
25970 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
25980 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
25990 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
259a0 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
259b0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
259c0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
259d0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
259e0 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
259f0 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
25a00 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
25a10 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
25a20 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
25a30 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
25a40 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
25a50 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
25a60 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
25a70 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
25a80 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
25a90 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
25aa0 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
25ab0 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
25ac0 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
25ad0 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
25ae0 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
25af0 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
25b00 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
25b10 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
25b20 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
25b30 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
25b40 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
25b50 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
25b60 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
25b70 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
25b80 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
25b90 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
25ba0 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
25bb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
25bc0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
25bd0 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
25be0 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
25bf0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
25c00 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
25c10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
25c20 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
25c30 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
25c40 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
25c50 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
25c60 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
25c70 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
25c80 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
25c90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
25ca0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
25cb0 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
25cc0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
25cd0 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
25ce0 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
25cf0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
25d00 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
25d10 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  D: {.      testc
25d20 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
25d30 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
25d40 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
25d50 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
25d60 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
25d70 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
25d80 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
25d90 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
25da0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
25db0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
25dc0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
25dd0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
25de0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25df0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
25e00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
25e10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
25e20 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
25e30 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
25e40 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
25e50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
25e60 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
25e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25e80 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
25e90 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
25ea0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  , jumpIfNull^SQL
25eb0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
25ec0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25ed0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
25ee0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
25ef0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
25f00 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
25f10 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
25f20 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
25f30 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
25f40 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
25f50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25f60 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
25f70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25f80 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
25f90 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
25fa0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
25fb0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
25fc0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
25fd0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
25fe0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
25ff0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
26000 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26010 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
26020 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
26030 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
26040 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
26050 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26060 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
26070 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
26080 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d  op = (pExpr->op=
26090 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20  =TK_IS) ? TK_NE 
260a0 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a  : TK_EQ;.      j
260b0 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49  umpIfNull = SQLI
260c0 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
260d0 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
260e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
260f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
26100 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
26110 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
26120 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
26130 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
26140 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
26150 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
26160 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
26170 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78   goto default_ex
26180 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  pr;.      testca
26190 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
261a0 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
261b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
261c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
261d0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
261e0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
261f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
26200 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
26210 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
26220 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
26230 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
26240 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
26250 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
26260 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
26270 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
26280 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26290 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
262a0 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
262b0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
262c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
262d0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
262e0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
262f0 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
26300 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
26310 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26320 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
26330 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
26340 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
26350 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
26360 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
26370 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
26380 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
26390 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
263a0 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
263b0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
263c0 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
263d0 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
263e0 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
263f0 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56  =OP_Eq);.      V
26400 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26410 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
26420 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
26430 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
26440 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26450 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
26460 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
26470 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
26480 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
26490 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
264a0 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
264b0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
264c0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
264d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
264e0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
264f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
26500 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
26510 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
26520 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
26530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
26540 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
26550 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
26560 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
26570 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26580 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
26590 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
265a0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
265b0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
265c0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
265d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
265e0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
265f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26600 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
26610 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
26620 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
26630 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65  LL );   VdbeCove
26640 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
26650 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
26660 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
26670 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62  _NOTNULL );  Vdb
26680 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26690 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
266a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
266b0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
266c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
266d0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
266e0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
266f0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
26700 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
26710 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
26720 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
26730 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
26740 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e  IfFalse, jumpIfN
26750 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
26760 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
26770 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
26780 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
26790 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
267a0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a  ( jumpIfNull ){.
267b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
267c0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
267d0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
267e0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
267f0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
26800 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
26810 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
26820 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
26830 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
26840 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
26850 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  st, destIfNull);
26860 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26870 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
26880 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
26890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
268a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
268b0 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
268c0 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78  {.    default_ex
268d0 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65  pr: .      if( e
268e0 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
268f0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
26900 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
26910 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
26920 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
26930 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
26940 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e   ){.        /* n
26950 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
26960 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
26970 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
26980 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
26990 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
269a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
269b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
269c0 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74  _IfNot, r1, dest
269d0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
269e0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
269f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
26a00 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
26a10 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
26a20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26a30 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
26a50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
26a60 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
26a70 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
26a80 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
26a90 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
26aa0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
26ab0 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b  2);.}../*.** Lik
26ac0 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  e sqlite3ExprIfF
26ad0 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68  alse() except th
26ae0 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64  at a copy is mad
26af0 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72  e of pExpr befor
26b00 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61  e.** code genera
26b10 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63  tion, and that c
26b20 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61  opy is deleted a
26b30 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61  fter code genera
26b40 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e  tion. This.** en
26b50 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f  sures that the o
26b60 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73  riginal pExpr is
26b70 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76   unchanged..*/.v
26b80 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
26b90 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20  fFalseDup(Parse 
26ba0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
26bb0 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69  Expr, int dest,i
26bc0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
26bd0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
26be0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
26bf0 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69  pr *pCopy = sqli
26c00 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
26c10 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
26c20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
26c30 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
26c40 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
26c50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73  arse, pCopy, des
26c60 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26c70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
26c80 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70  rDelete(db, pCop
26c90 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f  y);.}.../*.** Do
26ca0 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
26cb0 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
26cc0 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
26cd0 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
26ce0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
26cf0 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  are completely i
26d00 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72  dentical.  Retur
26d10 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66  n 1 if they diff
26d20 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20  er only.** by a 
26d30 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
26d40 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65   at the top leve
26d50 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20  l.  Return 2 if 
26d60 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
26d70 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74  ences.** other t
26d80 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  han the top-leve
26d90 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  l COLLATE operat
26da0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  or..**.** If any
26db0 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
26dc0 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
26dd0 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
26de0 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
26df0 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
26e00 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
26e10 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
26e20 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
26e30 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iTab..**.** The 
26e40 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65  pA side might be
26e50 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
26e60 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  ER.  If that is 
26e70 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20  the case and pB 
26e80 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20  is.** not using 
26e90 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20  TK_REGISTER but 
26ea0 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75  is otherwise equ
26eb0 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74  ivalent, then st
26ec0 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ill return 0..**
26ed0 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  .** Sometimes th
26ee0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
26ef0 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66  return 2 even if
26f00 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
26f10 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
26f20 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
26f30 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
26f40 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
26f50 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
26f60 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
26f70 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65  urn 2 just to be
26f80 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
26f90 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
26fa0 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f  turns 2, then yo
26fb0 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
26fc0 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
26fd0 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
26fe0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
26ff0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
27000 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20   you get a 0 or 
27010 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  1 return, then y
27020 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
27030 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
27040 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
27050 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
27060 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
27070 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
27080 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
27090 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32  o get an extra 2
270a0 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20   - that.** just 
270b0 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
270c0 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c  some slightly sl
270d0 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20  ower code.  But 
270e0 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20  returning.** an 
270f0 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31  incorrect 0 or 1
27100 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
27110 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f   malfunction..*/
27120 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
27130 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
27140 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
27150 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d  iTab){.  u32 com
27160 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66  binedFlags;.  if
27170 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
27180 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
27190 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
271a0 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61   }.  combinedFla
271b0 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c  gs = pA->flags |
271c0 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66   pB->flags;.  if
271d0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
271e0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
271f0 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  .    if( (pA->fl
27200 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50  ags&pB->flags&EP
27210 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26  _IntValue)!=0 &&
27220 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70   pA->u.iValue==p
27230 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
27240 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
27250 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
27260 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
27270 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20  >op!=pB->op ){. 
27280 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
27290 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
272a0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
272b0 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69  pA->pLeft, pB, i
272c0 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
272d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
272e0 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d      if( pB->op==
272f0 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
27300 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
27310 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20  (pA, pB->pLeft, 
27320 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
27330 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
27340 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
27350 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
27360 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
27370 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
27380 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f  UMN && pA->u.zTo
27390 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ken ){.    if( p
273a0 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  A->op==TK_FUNCTI
273b0 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ON ){.      if( 
273c0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
273d0 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
273e0 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72  u.zToken)!=0 ) r
273f0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c  eturn 2;.    }el
27400 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41  se if( strcmp(pA
27410 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
27420 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20  .zToken)!=0 ){. 
27430 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e       return pA->
27440 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f  op==TK_COLLATE ?
27450 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20   1 : 2;.    }.  
27460 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  }.  if( (pA->fla
27470 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
27480 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
27490 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72  EP_Distinct) ) r
274a0 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41  eturn 2;.  if( A
274b0 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46  LWAYS((combinedF
274c0 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f  lags & EP_TokenO
274d0 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nly)==0) ){.    
274e0 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
274f0 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
27500 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
27510 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
27520 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66  Compare(pA->pLef
27530 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  t, pB->pLeft, iT
27540 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
27550 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
27560 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
27570 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
27580 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
27590 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
275a0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
275b0 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c  are(pA->x.pList,
275c0 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54   pB->x.pList, iT
275d0 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
275e0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 28      if( ALWAYS((
275f0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
27600 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20  EP_Reduced)==0) 
27610 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54  && pA->op!=TK_ST
27620 52 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66  RING ){.      if
27630 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  ( pA->iColumn!=p
27640 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
27650 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28  urn 2;.      if(
27660 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
27670 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20  >iTable .       
27680 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d  && (pA->iTable!=
27690 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42  iTab || NEVER(pB
276a0 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20  ->iTable>=0)) ) 
276b0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
276c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
276d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
276e0 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
276f0 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
27700 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
27710 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
27720 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
27730 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
27740 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
27750 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
27760 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
27770 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
27780 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
27790 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
277a0 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
277b0 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
277c0 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
277d0 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Tab..**.** This 
277e0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
277f0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
27800 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
27810 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
27820 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
27830 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
27840 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
27850 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
27860 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
27870 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
27880 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
27890 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
278a0 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
278b0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
278c0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
278d0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
278e0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
278f0 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
27900 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
27910 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
27920 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
27930 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
27940 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
27950 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
27960 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
27970 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
27980 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
27990 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
279a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
279b0 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
279c0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
279d0 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
279e0 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
279f0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
27a00 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
27a10 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
27a20 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
27a30 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
27a40 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
27a50 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
27a60 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
27a70 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
27a80 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
27a90 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
27aa0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
27ab0 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61  prA, pExprB, iTa
27ac0 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
27ad0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
27ae0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
27af0 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72  rue if we can pr
27b00 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c  ove the pE2 will
27b10 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20   always be true 
27b20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75  if pE1 is.** tru
27b30 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  e.  Return false
27b40 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f   if we cannot co
27b50 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66  mplete the proof
27b60 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74   or if pE2 might
27b70 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45  .** be false.  E
27b80 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
27b90 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20     pE1: x==5    
27ba0 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
27bb0 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
27bc0 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
27bd0 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32  : x>0        pE2
27be0 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
27bf0 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
27c00 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32  .**     pE1: x=2
27c10 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32  1       pE2: x=2
27c20 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65  1 OR y=43     Re
27c30 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
27c40 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20    pE1: x!=123   
27c50 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
27c60 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
27c70 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
27c80 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a   x!=?1      pE2:
27c90 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
27ca0 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
27cb0 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20  *     pE1: x IS 
27cc0 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20  NULL  pE2: x IS 
27cd0 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
27ce0 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
27cf0 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20   pE1: x IS ?2   
27d00 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
27d10 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66  ULL    Reuslt: f
27d20 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  alse.**.** When 
27d30 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c  comparing TK_COL
27d40 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65  UMN nodes betwee
27d50 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69  n pE1 and pE2, i
27d60 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70  f pE2 has.** Exp
27d70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20  r.iTable<0 then 
27d80 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e  assume a table n
27d90 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69  umber given by i
27da0 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Tab..**.** When 
27db0 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
27dc0 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
27dd0 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
27de0 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
27df0 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
27e00 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
27e10 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
27e20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
27e30 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
27e40 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
27e50 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
27e60 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
27e70 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
27e80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
27e90 72 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70  rImpliesExpr(Exp
27ea0 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45  r *pE1, Expr *pE
27eb0 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  2, int iTab){.  
27ec0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
27ed0 6f 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c  ompare(pE1, pE2,
27ee0 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20   iTab)==0 ){.   
27ef0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
27f00 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
27f10 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74  _OR.   && (sqlit
27f20 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
27f30 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66  r(pE1, pE2->pLef
27f40 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20  t, iTab).       
27f50 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
27f60 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
27f70 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74  pE1, pE2->pRight
27f80 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20  , iTab) ).  ){. 
27f90 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
27fa0 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
27fb0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45  TK_NOTNULL && pE
27fc0 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  1->op!=TK_ISNULL
27fd0 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f   && pE1->op!=TK_
27fe0 49 53 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  IS ){.    Expr *
27ff0 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pX = sqlite3Expr
28000 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d  SkipCollate(pE1-
28010 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 74 65 73  >pLeft);.    tes
28020 74 63 61 73 65 28 20 70 58 21 3d 70 45 31 2d 3e  tcase( pX!=pE1->
28030 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 69 66 28  pLeft );.    if(
28040 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
28050 61 72 65 28 70 58 2c 20 70 45 32 2d 3e 70 4c 65  are(pX, pE2->pLe
28060 66 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72  ft, iTab)==0 ) r
28070 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
28080 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
28090 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
280a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
280b0 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
280c0 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c   by the tree wal
280d0 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ker.** to determ
280e0 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72 65 73  ine if an expres
280f0 73 69 6f 6e 20 63 61 6e 20 62 65 20 65 76 61 6c  sion can be eval
28100 75 61 74 65 64 20 62 79 20 72 65 66 65 72 65 6e  uated by referen
28110 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64  ce to the.** ind
28120 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74  ex only, without
28130 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 20   having to do a 
28140 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 63  search for the c
28150 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
28160 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 20 54 68  table entry.  Th
28170 65 20 49 64 78 43 6f 76 65 72 2e 70 49 64 78 20  e IdxCover.pIdx 
28180 66 69 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64  field is the ind
28190 65 78 2e 20 20 49 64 78 43 6f 76 65 72 2e 69 43  ex.  IdxCover.iC
281a0 75 72 0a 2a 2a 20 69 73 20 74 68 65 20 63 75 72  ur.** is the cur
281b0 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sor for the tabl
281c0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78  e..*/.struct Idx
281d0 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65 78 20  Cover {.  Index 
281e0 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68  *pIdx;     /* Th
281f0 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65  e index to be te
28200 73 74 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67  sted for coverag
28210 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  e */.  int iCur;
28220 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
28230 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
28240 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e   table correspon
28250 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65  ding to the inde
28260 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  x */.};../*.** C
28270 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
28280 68 65 72 65 20 61 72 65 20 72 65 66 65 72 65 6e  here are referen
28290 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
282a0 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c  n table .** pWal
282b0 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
282c0 2d 3e 69 43 75 72 20 63 61 6e 20 62 65 20 73 61  ->iCur can be sa
282d0 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 74 68  tisfied using th
282e0 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b  e index.** pWalk
282f0 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
28300 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  >pIdx..*/.static
28310 20 69 6e 74 20 65 78 70 72 49 64 78 43 6f 76 65   int exprIdxCove
28320 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
28330 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
28340 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
28350 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
28360 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
28370 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78  =pWalker->u.pIdx
28380 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20 20 26  Cover->iCur.   &
28390 26 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  & sqlite3ColumnO
283a0 66 49 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e  fIndex(pWalker->
283b0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64  u.pIdxCover->pId
283c0 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  x, pExpr->iColum
283d0 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57  n)<0.  ){.    pW
283e0 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31  alker->eCode = 1
283f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
28400 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65  _Abort;.  }.  re
28410 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
28420 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  e;.}../*.** Dete
28430 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e 64 65  rmine if an inde
28440 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c 65 20  x pIdx on table 
28450 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72  with cursor iCur
28460 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a   contains will.*
28470 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
28480 20 70 45 78 70 72 2e 20 20 52 65 74 75 72 6e 20   pExpr.  Return 
28490 74 72 75 65 20 69 66 20 74 68 65 20 69 6e 64 65  true if the inde
284a0 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74 68 65  x does cover the
284b0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
284c0 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  nd false if the 
284d0 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
284e0 20 72 65 66 65 72 65 6e 63 65 73 20 74 61 62 6c   references tabl
284f0 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61  e columns.** tha
28500 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20  t are not found 
28510 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  in the index pId
28520 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65  x..**.** An inde
28530 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20 65 78  x covering an ex
28540 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74  pression means t
28550 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
28560 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61  on can be.** eva
28570 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c  luated using onl
28580 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  y the index and 
28590 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
285a0 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20  o lookup the.** 
285b0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
285c0 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e  ble entry..*/.in
285d0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76  t sqlite3ExprCov
285e0 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20 20 45  eredByIndex(.  E
285f0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
28600 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
28610 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a 2f 0a  to be tested */.
28620 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
28630 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
28640 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
28650 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
28660 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65   table */.  Inde
28670 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
28680 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61  /* The index tha
28690 74 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  t might be used 
286a0 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  for coverage */.
286b0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
286c0 20 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72   struct IdxCover
286d0 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28   xcov;.  memset(
286e0 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
286f0 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72 20 3d  );.  xcov.iCur =
28700 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49   iCur;.  xcov.pI
28710 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78  dx = pIdx;.  w.x
28720 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
28730 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20 20 77  xprIdxCover;.  w
28740 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d 20 26  .u.pIdxCover = &
28750 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33 57  xcov;.  sqlite3W
28760 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
28770 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e  r);.  return !w.
28780 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  eCode;.}.../*.**
28790 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
287a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
287b0 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
287c0 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  by the tree walk
287d0 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72  er.** to count r
287e0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
287f0 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  le columns in th
28800 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61  e arguments of a
28810 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20  n .** aggregate 
28820 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64  function, in ord
28830 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
28840 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75  the.** sqlite3Fu
28850 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20  nctionThisSrc() 
28860 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75  routine..*/.stru
28870 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20  ct SrcCount {.  
28880 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
28890 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c   /* One particul
288a0 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  ar FROM clause i
288b0 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79  n a nested query
288c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b   */.  int nThis;
288d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
288e0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
288f0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72  o columns in pSr
28900 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  cList */.  int n
28910 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e  Other;      /* N
28920 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
28930 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
28940 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  n other FROM cla
28950 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  uses */.};../*.*
28960 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
28970 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
28980 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a   to columns..*/.
28990 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
289a0 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a  rcCount(Walker *
289b0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
289c0 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Expr){.  /* The 
289d0 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73  NEVER() on the s
289e0 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65  econd term is be
289f0 63 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e  cause sqlite3Fun
28a00 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
28a10 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79  ().  ** is alway
28a20 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
28a30 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
28a40 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61  zeAggregates() a
28a50 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54  nd so the.  ** T
28a60 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e  K_COLUMNs have n
28a70 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76  ot yet been conv
28a80 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47  erted into TK_AG
28a90 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20  G_COLUMN.  If.  
28aa0 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
28ab0 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20  onUsesThisSrc() 
28ac0 69 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e  is used differen
28ad0 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72  tly in the futur
28ae0 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45  e, the.  ** NEVE
28af0 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  R() will need to
28b00 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a   be removed. */.
28b10 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
28b20 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45  =TK_COLUMN || NE
28b30 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  VER(pExpr->op==T
28b40 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b  K_AGG_COLUMN) ){
28b50 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
28b60 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
28b70 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
28b80 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53  pSrcCount;.    S
28b90 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
28ba0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20  ->pSrc;.    int 
28bb0 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53  nSrc = pSrc ? pS
28bc0 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20  rc->nSrc : 0;.  
28bd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72    for(i=0; i<nSr
28be0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
28bf0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
28c00 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  ==pSrc->a[i].iCu
28c10 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
28c20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53    }.    if( i<nS
28c30 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  rc ){.      p->n
28c40 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  This++;.    }els
28c50 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68  e{.      p->nOth
28c60 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  er++;.    }.  }.
28c70 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
28c80 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
28c90 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79  Determine if any
28ca0 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
28cb0 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46  s to the pExpr F
28cc0 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63  unction referenc
28cd0 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20  e.** pSrcList.  
28ce0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
28cf0 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65  hey do.  Also re
28d00 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
28d10 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
28d20 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72   no arguments or
28d30 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61   has only consta
28d40 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
28d50 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70  eturn false if p
28d60 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63  Expr.** referenc
28d70 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e  es columns but n
28d80 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61  ot columns of ta
28d90 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53  bles found in pS
28da0 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73  rcList..*/.int s
28db0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
28dc0 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a  esThisSrc(Expr *
28dd0 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a  pExpr, SrcList *
28de0 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c  pSrcList){.  Wal
28df0 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20  ker w;.  struct 
28e00 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20  SrcCount cnt;.  
28e10 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28e20 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
28e30 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ON );.  memset(&
28e40 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
28e50 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
28e60 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75  ack = exprSrcCou
28e70 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f  nt;.  w.u.pSrcCo
28e80 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e  unt = &cnt;.  cn
28e90 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73  t.pSrc = pSrcLis
28ea0 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d  t;.  cnt.nThis =
28eb0 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72   0;.  cnt.nOther
28ec0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57   = 0;.  sqlite3W
28ed0 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20  alkExprList(&w, 
28ee0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
28ef0 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54  .  return cnt.nT
28f00 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74  his>0 || cnt.nOt
28f10 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  her==0;.}../*.**
28f20 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
28f30 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
28f40 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79  fo->aCol[] array
28f50 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
28f60 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
28f70 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
28f80 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
28f90 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
28fa0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
28fb0 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  int addAggInfoCo
28fc0 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  lumn(sqlite3 *db
28fd0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
28fe0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
28ff0 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  nfo->aCol = sqli
29000 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
29010 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20  (.       db,.   
29020 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c      pInfo->aCol,
29030 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
29040 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a  Info->aCol[0]),.
29050 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
29060 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26  Column,.       &
29070 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
29080 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
29090 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
290a0 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
290b0 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79  o->aFunc[] array
290c0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
290d0 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
290e0 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
290f0 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
29100 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
29110 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
29120 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75  int addAggInfoFu
29130 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nc(sqlite3 *db, 
29140 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
29150 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
29160 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74  o->aFunc = sqlit
29170 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
29180 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20  .       db, .   
29190 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63      pInfo->aFunc
291a0 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
291b0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29  pInfo->aFunc[0])
291c0 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
291d0 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26  >nFunc,.       &
291e0 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
291f0 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
29200 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70  This is the xExp
29210 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20  rCallback for a 
29220 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74  tree walker.  It
29230 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69   is used to.** i
29240 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
29250 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
29260 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71  gates().  See sq
29270 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
29280 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f  Aggregates.** fo
29290 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
292a0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
292b0 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
292c0 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20  ggregate(Walker 
292d0 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
292e0 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
292f0 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
29300 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
29310 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70  .pNC;.  Parse *p
29320 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
29330 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse;.  SrcList *
29340 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
29350 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49  pSrcList;.  AggI
29360 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
29370 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a  pNC->pAggInfo;..
29380 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
29390 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
293a0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
293b0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
293c0 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
293d0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
293e0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
293f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
29400 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
29410 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f  OLUMN );.      /
29420 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
29430 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
29440 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  in one of the ta
29450 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
29460 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
29470 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
29480 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
29490 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
294a0 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
294b0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
294c0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
294d0 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20   pSrcList->a;.  
294e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
294f0 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
29500 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
29510 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
29520 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
29530 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ol;.          as
29540 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
29550 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
29560 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
29570 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
29580 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
29590 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
295a0 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
295b0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65       /* If we re
295c0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
295d0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45  it means that pE
295e0 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20  xpr refers to a 
295f0 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
29600 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20    ** that is in 
29610 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
29620 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
29630 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20   query.  .      
29640 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
29650 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20       ** Make an 
29660 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f  entry for the co
29670 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f  lumn in pAggInfo
29680 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72  ->aCol[] if ther
29690 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
296a0 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79   is not an entry
296b0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
296c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
296d0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
296e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
296f0 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ol = pAggInfo->a
29700 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
29710 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67   for(k=0; k<pAgg
29720 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  Info->nColumn; k
29730 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
29740 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
29750 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78  Col->iTable==pEx
29760 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
29770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29780 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  pCol->iColumn==p
29790 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
297a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
297b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
297c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
297d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
297e0 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e    if( (k>=pAggIn
297f0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20  fo->nColumn).   
29800 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20            && (k 
29810 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  = addAggInfoColu
29820 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  mn(pParse->db, p
29830 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20  AggInfo))>=0 .  
29840 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
29850 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
29860 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
29870 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[k];.          
29880 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d      pCol->pTab =
29890 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
298a0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
298b0 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
298c0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
298d0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
298e0 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
298f0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
29900 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d        pCol->iMem
29910 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
29920 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
29930 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
29940 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
29950 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
29960 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
29970 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
29980 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
29990 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
299a0 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a        int j, n;.
299b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299c0 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20  ExprList *pGB = 
299d0 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
299e0 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  By;.            
299f0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
29a00 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20  ist_item *pTerm 
29a10 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20  = pGB->a;.      
29a20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47            n = pG
29a30 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  B->nExpr;.      
29a40 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
29a50 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65  0; j<n; j++, pTe
29a60 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
29a70 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
29a80 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
29a90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29aa0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
29ab0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d  TK_COLUMN && pE-
29ac0 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
29ad0 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29af0 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pE->iColumn==pEx
29b00 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
29b30 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
29b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
29b60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29b70 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29b80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29b90 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
29ba0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
29bb0 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
29bc0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
29bd0 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41  orterColumn = pA
29be0 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67  ggInfo->nSorting
29bf0 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
29c00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29c20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
29c30 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  now an entry for
29c40 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e   pExpr in pAggIn
29c50 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68  fo->aCol[] (eith
29c60 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
29c70 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  * because it was
29c80 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72   there before or
29c90 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
29ca0 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20   created it)..  
29cb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e            ** Con
29cc0 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74  vert the pExpr t
29cd0 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f  o be a TK_AGG_CO
29ce0 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74  LUMN referring t
29cf0 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  o that.         
29d00 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e     ** pAggInfo->
29d10 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20  aCol[] entry..  
29d20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
29d30 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
29d40 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
29d50 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
29d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
29d70 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
29d80 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
29d90 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
29da0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a   TK_AGG_COLUMN;.
29db0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
29dc0 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b  r->iAgg = (i16)k
29dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
29de0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
29df0 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d   /* endif pExpr-
29e00 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
29e10 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20  iCursor */.     
29e20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70     } /* end loop
29e30 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a   over pSrcList *
29e40 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
29e50 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
29e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
29e70 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
29e80 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  : {.      if( (p
29e90 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
29ea0 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20  _InAggFunc)==0. 
29eb0 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72        && pWalker
29ec0 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70  ->walkerDepth==p
29ed0 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20  Expr->op2.      
29ee0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
29ef0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
29f00 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
29f10 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
29f20 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
29f30 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
29f40 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
29f50 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
29f60 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
29f70 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
29f80 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
29f90 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
29fa0 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
29fb0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
29fc0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
29fd0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
29fe0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29ff0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
2a000 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
2a010 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
2a020 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2a030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a040 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2a050 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
2a060 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
2a070 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
2a080 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
2a090 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
2a0a0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
2a0b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a0c0 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
2a0d0 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
2a0e0 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
2a0f0 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
2a100 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
2a110 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a120 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
2a130 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2a140 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2a150 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2a160 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2a170 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
2a180 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
2a190 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2a1a0 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2a1c0 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
2a1d0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2a1e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2a1f0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a200 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
2a210 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2a220 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
2a230 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
2a240 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
2a250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a260 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
2a270 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ken, .          
2a280 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2a290 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  x.pList ? pExpr-
2a2a0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
2a2b0 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
2a2c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2a2d0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
2a2e0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2a2f0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2a300 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
2a310 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2a320 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2a340 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2a350 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
2a360 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2a370 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a380 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
2a390 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
2a3a0 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
2a3b0 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
2a3c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2a3d0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2a3e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2a3f0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
2a400 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2a410 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
2a420 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
2a430 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2a440 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
2a450 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20  gg = (i16)i;.   
2a460 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
2a470 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
2a480 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2a490 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
2a4a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a4b0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2a4c0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2a4d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2a4e0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2a4f0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2a500 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2a510 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
2a520 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
2a530 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
2a540 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c 6b  _PARAMETER(pWalk
2a550 65 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  er);.  UNUSED_PA
2a560 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29  RAMETER(pSelect)
2a570 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
2a580 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2a590 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45  * Analyze the pE
2a5a0 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  xpr expression l
2a5b0 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
2a5c0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
2a5d0 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
2a5e0 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
2a5f0 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67 67   be added to Agg
2a600 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
2a610 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a   pNC->pAggInfo.*
2a620 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64  * points to.  Ad
2a630 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
2a640 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65   are made on the
2a650 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
2a660 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e  as.** necessary.
2a670 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2a680 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
2a690 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
2a6a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
2a6b0 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79  as been.** analy
2a6c0 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65  zed by sqlite3Re
2a6d0 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
2a6e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a6f0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2a700 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65  egates(NameConte
2a710 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70  xt *pNC, Expr *p
2a720 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
2a730 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
2a740 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
2a750 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2a760 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2a770 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ate;.  w.xSelect
2a780 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
2a790 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2a7a0 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20  lect;.  w.u.pNC 
2a7b0 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28  = pNC;.  assert(
2a7c0 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
2a7d0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  0 );.  sqlite3Wa
2a7e0 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
2a7f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
2a800 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2a810 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
2a820 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
2a830 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
2a840 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
2a850 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2a860 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
2a870 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
2a880 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
2a890 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
2a8a0 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
2a8b0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2a8c0 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
2a8d0 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
2a8e0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
2a8f0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2a900 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
2a910 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
2a920 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
2a930 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
2a940 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
2a950 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2a960 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2a970 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2a980 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
2a990 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
2a9a0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2a9b0 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67  a single new reg
2a9c0 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f  ister for use to
2a9d0 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72   hold some inter
2a9e0 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a  mediate result..
2a9f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2aa00 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
2aa10 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
2aa20 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d  Parse->nTempReg=
2aa30 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2aa40 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2aa50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
2aa60 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
2aa70 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
2aa80 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  g];.}../*.** Dea
2aa90 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
2aaa0 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c  er, making avail
2aab0 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66  able for reuse f
2aac0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
2aad0 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20   purpose..**.** 
2aae0 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73  If a register is
2aaf0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
2ab00 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c   used by the col
2ab10 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a  umn cache, then.
2ab20 2a 2a 20 74 68 65 20 64 65 61 6c 6c 6f 63 61 74  ** the deallocat
2ab30 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20  ion is deferred 
2ab40 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e  until the column
2ab50 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74   cache line that
2ab60 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67   uses.** the reg
2ab70 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74  ister becomes st
2ab80 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ale..*/.void sql
2ab90 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2aba0 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
2abb0 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
2abc0 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
2abd0 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
2abe0 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
2abf0 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69  empReg) ){.    i
2ac00 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
2ac10 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
2ac20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50     for(i=0, p=pP
2ac30 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
2ac40 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
2ac50 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ache; i++, p++){
2ac60 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52  .      if( p->iR
2ac70 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
2ac80 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
2ac90 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
2aca0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
2acb0 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  }.    pParse->aT
2acc0 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
2acd0 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
2ace0 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
2acf0 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
2ad00 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
2ad10 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
2ad20 76 65 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f  ve registers..*/
2ad30 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
2ad40 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
2ad50 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67  pParse, int nReg
2ad60 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
2ad70 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72   if( nReg==1 ) r
2ad80 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74  eturn sqlite3Get
2ad90 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
2ada0 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69  .  i = pParse->i
2adb0 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20  RangeReg;.  n = 
2adc0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2add0 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e  g;.  if( nReg<=n
2ade0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2adf0 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63  !usedAsColumnCac
2ae00 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b  he(pParse, i, i+
2ae10 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72  n-1) );.    pPar
2ae20 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d  se->iRangeReg +=
2ae30 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
2ae40 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20  e->nRangeReg -= 
2ae50 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nReg;.  }else{. 
2ae60 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e     i = pParse->n
2ae70 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
2ae80 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
2ae90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
2aea0 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  .}.void sqlite3R
2aeb0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2aec0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2aed0 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
2aee0 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d  g){.  if( nReg==
2aef0 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
2af00 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
2af10 50 61 72 73 65 2c 20 69 52 65 67 29 3b 0a 20 20  Parse, iReg);.  
2af20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2af30 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2af40 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
2af50 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66  Reg, nReg);.  if
2af60 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e  ( nReg>pParse->n
2af70 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20  RangeReg ){.    
2af80 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2af90 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50  g = nReg;.    pP
2afa0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2afb0 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
2afc0 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65  *.** Mark all te
2afd0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2afe0 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61  s as being unava
2aff0 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
2b000 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2b010 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2b020 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
2b030 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65  ){.  pParse->nTe
2b040 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61  mpReg = 0;.  pPa
2b050 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2b060 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c   0;.}../*.** Val
2b070 69 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65  idate that no te
2b080 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2b090 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68   falls within th
2b0a0 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46  e range of.** iF
2b0b0 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63  irst..iLast, inc
2b0c0 6c 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f  lusive.  This ro
2b0d0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
2b0e0 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ll from within a
2b0f0 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
2b100 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  ments..*/.#ifdef
2b110 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
2b120 74 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73  t sqlite3NoTemps
2b130 49 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  InRange(Parse *p
2b140 50 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73  Parse, int iFirs
2b150 74 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20  t, int iLast){. 
2b160 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50   int i;.  if( pP
2b170 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e  arse->nRangeReg>
2b180 30 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e  0.   && pParse->
2b190 69 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65  iRangeReg+pParse
2b1a0 2d 3e 6e 52 61 6e 67 65 52 65 67 3c 69 4c 61 73  ->nRangeReg<iLas
2b1b0 74 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e  t.   && pParse->
2b1c0 69 52 61 6e 67 65 52 65 67 3e 3d 69 46 69 72 73  iRangeReg>=iFirs
2b1d0 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75  t.  ){.     retu
2b1e0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
2b1f0 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
2b200 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20  TempReg; i++){. 
2b210 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
2b220 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72  TempReg[i]>=iFir
2b230 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54  st && pParse->aT
2b240 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74  empReg[i]<=iLast
2b250 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2b260 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2b270 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2b280 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
2b290 55 47 20 2a 2f 0a                                UG */.