/ Hex Artifact Content
Login

Artifact c1de78269522de39f6ad877ab0810a5d48f91f34:


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 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
38e0: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70   pRet ){.      p
38f0: 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69  Ret->iColumn = i
3900: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65  Field;.      pRe
3910: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74  t->pLeft = pVect
3920: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
3930: 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c  sert( pRet==0 ||
3940: 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30   pRet->iTable==0
3950: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
3960: 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70   if( pVector->op
3970: 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56  ==TK_VECTOR ) pV
3980: 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d  ector = pVector-
3990: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65  >x.pList->a[iFie
39a0: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  ld].pExpr;.    p
39b0: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
39c0: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
39d0: 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20   pVector, 0);.  
39e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
39f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
3a00: 66 69 6e 65 28 53 51 4c 49 54 45 5f 4f 4d 49 54  fine(SQLITE_OMIT
3a10: 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a 2f  _SUBQUERY) */../
3a20: 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69  *.** If expressi
3a30: 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20 74  on pExpr is of t
3a40: 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67  ype TK_SELECT, g
3a50: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
3a60: 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20  evaluate.** it. 
3a70: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
3a80: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  ter in which the
3a90: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3aa0: 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a  d (or, if the .*
3ab0: 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74  * sub-select ret
3ac0: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
3ad0: 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66  ne column, the f
3ae0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3af0: 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72 73  .** of registers
3b00: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3b10: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29 2e  sult is stored).
3b20: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
3b30: 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45  is not a TK_SELE
3b40: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  CT expression, r
3b50: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
3b60: 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 53  ic int exprCodeS
3b70: 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ubselect(Parse *
3b80: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
3b90: 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67 20  xpr){.  int reg 
3ba0: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
3bb0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
3bc0: 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  Y.  if( pExpr->o
3bd0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
3be0: 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74 65      reg = sqlite
3bf0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
3c00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
3c10: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
3c20: 20 20 72 65 74 75 72 6e 20 72 65 67 3b 0a 7d 0a    return reg;.}.
3c30: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
3c40: 70 56 65 63 74 6f 72 20 70 6f 69 6e 74 73 20 74  pVector points t
3c50: 6f 20 61 20 76 65 63 74 6f 72 20 65 78 70 72 65  o a vector expre
3c60: 73 73 69 6f 6e 20 2d 20 65 69 74 68 65 72 20 61  ssion - either a
3c70: 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72   TK_VECTOR.** or
3c80: 20 54 4b 5f 53 45 4c 45 43 54 20 74 68 61 74 20   TK_SELECT that 
3c90: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3ca0: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54 68  n one column. Th
3cb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
3cc0: 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  rns.** the regis
3cd0: 74 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  ter number of a 
3ce0: 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63 6f  register that co
3cf0: 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
3d00: 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 69   of.** element i
3d10: 46 69 65 6c 64 20 6f 66 20 74 68 65 20 76 65 63  Field of the vec
3d20: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56  tor..**.** If pV
3d30: 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45  ector is a TK_SE
3d40: 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c  LECT expression,
3d50: 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 69   then code for i
3d60: 74 20 6d 75 73 74 20 68 61 76 65 20 0a 2a 2a 20  t must have .** 
3d70: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e  already been gen
3d80: 65 72 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  erated using the
3d90: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
3da0: 63 74 28 29 20 72 6f 75 74 69 6e 65 2e 20 49 6e  ct() routine. In
3db0: 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 70 61   this.** case pa
3dc0: 72 61 6d 65 74 65 72 20 72 65 67 53 65 6c 65 63  rameter regSelec
3dd0: 74 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  t should be the 
3de0: 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
3df0: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 2a  y of registers.*
3e00: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
3e10: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
3e20: 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a 0a  sub-select. .**.
3e30: 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69 73  ** If pVector is
3e40: 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54   of type TK_VECT
3e50: 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  OR, then code fo
3e60: 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  r the requested 
3e70: 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67 65 6e 65  field.** is gene
3e80: 72 61 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  rated. In this c
3e90: 61 73 65 20 28 2a 70 52 65 67 46 72 65 65 29 20  ase (*pRegFree) 
3ea0: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 74 68  may be set to th
3eb0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61  e number of.** a
3ec0: 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
3ed0: 74 65 72 20 74 6f 20 62 65 20 66 72 65 65 64 20  ter to be freed 
3ee0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 65  by the caller be
3ef0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
3f00: 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
3f10: 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75 74 20 70  urning, output p
3f20: 61 72 61 6d 65 74 65 72 20 28 2a 70 70 45 78 70  arameter (*ppExp
3f30: 72 29 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  r) is set to poi
3f40: 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 45 78 70  nt to the.** Exp
3f50: 72 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  r object corresp
3f60: 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65 6d 65 6e  onding to elemen
3f70: 74 20 69 45 6c 65 6d 20 6f 66 20 74 68 65 20 76  t iElem of the v
3f80: 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ector..*/.static
3f90: 20 69 6e 74 20 65 78 70 72 56 65 63 74 6f 72 52   int exprVectorR
3fa0: 65 67 69 73 74 65 72 28 0a 20 20 50 61 72 73 65  egister(.  Parse
3fb0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
3fd0: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
3fe0: 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20   Expr *pVector, 
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f 20 65 78   /* Vector to ex
4010: 74 72 61 63 74 20 65 6c 65 6d 65 6e 74 20 66 72  tract element fr
4020: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65  om */.  int iFie
4030: 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ld,             
4040: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64          /* Field
4050: 20 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f 6d   to extract from
4060: 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20 20 69 6e   pVector */.  in
4070: 74 20 72 65 67 53 65 6c 65 63 74 2c 20 20 20 20  t regSelect,    
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4090: 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79 20   First in array 
40a0: 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  of registers */.
40b0: 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 2c    Expr **ppExpr,
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40d0: 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70 72 65 73    /* OUT: Expres
40e0: 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  sion element */.
40f0: 20 20 69 6e 74 20 2a 70 52 65 67 46 72 65 65 20    int *pRegFree 
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d 70 20 72    /* OUT: Temp r
4120: 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20  egister to free 
4130: 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20  */.){.  u8 op = 
4140: 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a 20 20 61  pVector->op;.  a
4150: 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 56 45  ssert( op==TK_VE
4160: 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52  CTOR || op==TK_R
4170: 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54  EGISTER || op==T
4180: 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 69 66  K_SELECT );.  if
4190: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
41a0: 52 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72  R ){.    *ppExpr
41b0: 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
41c0: 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 56 65  FieldSubexpr(pVe
41d0: 63 74 6f 72 2c 20 69 46 69 65 6c 64 29 3b 0a 20  ctor, iField);. 
41e0: 20 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f     return pVecto
41f0: 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69 65 6c 64  r->iTable+iField
4200: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
4210: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
4220: 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74   *ppExpr = pVect
4230: 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  or->x.pSelect->p
4240: 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d  EList->a[iField]
4250: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 72 65 74  .pExpr;.     ret
4260: 75 72 6e 20 72 65 67 53 65 6c 65 63 74 2b 69 46  urn regSelect+iF
4270: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a 70 70 45  ield;.  }.  *ppE
4280: 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  xpr = pVector->x
4290: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
42a0: 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72  ].pExpr;.  retur
42b0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  n sqlite3ExprCod
42c0: 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 2a 70  eTemp(pParse, *p
42d0: 70 45 78 70 72 2c 20 70 52 65 67 46 72 65 65 29  pExpr, pRegFree)
42e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65  ;.}../*.** Expre
42f0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61  ssion pExpr is a
4300: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77   comparison betw
4310: 65 65 6e 20 74 77 6f 20 76 65 63 74 6f 72 20 76  een two vector v
4320: 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74 65 0a 2a  alues. Compute.*
4330: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
4340: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 28  the comparison (
4350: 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c 29 20 61  1, 0, or NULL) a
4360: 6e 64 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a  nd write that.**
4370: 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65 67   result into reg
4380: 69 73 74 65 72 20 64 65 73 74 2e 0a 2a 2a 0a 2a  ister dest..**.*
4390: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
43a0: 74 20 73 61 74 69 73 66 79 20 74 68 65 20 66 6f  t satisfy the fo
43b0: 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f 6e 64 69  llowing precondi
43c0: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tions:.**.**    
43d0: 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  if pExpr->op==TK
43e0: 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d 3d 54 4b  _IS:      op==TK
43f0: 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49  _EQ and p5==SQLI
4400: 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20  TE_NULLEQ.**    
4410: 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  if pExpr->op==TK
4420: 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54 4b  _ISNOT:   op==TK
4430: 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49  _NE and p5==SQLI
4440: 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20  TE_NULLEQ.**    
4450: 6f 74 68 65 72 77 69 73 65 3a 20 20 20 20 20 20  otherwise:      
4460: 20 20 20 20 20 20 20 20 20 20 6f 70 3d 3d 70 45            op==pE
4470: 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70 35 3d 3d  xpr->op and p5==
4480: 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  0.*/.static void
4490: 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61   codeVectorCompa
44a0: 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
44b0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  rse,        /* C
44c0: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 6f  ode generator co
44d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
44e0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
44f0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
4500: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
4510: 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
4520: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
4530: 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 74 68   results into th
4540: 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  is register */. 
4550: 20 75 38 20 6f 70 2c 20 20 20 20 20 20 20 20 20   u8 op,         
4560: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
4570: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ison operator */
4580: 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
4590: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
45a0: 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20 7a 65 72  TE_NULLEQ or zer
45b0: 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  o */.){.  Vdbe *
45c0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
45d0: 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  e;.  Expr *pLeft
45e0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
45f0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20  .  Expr *pRight 
4600: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
4610: 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 73  .  int nLeft = s
4620: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
4630: 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 69  Size(pLeft);.  i
4640: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 4c  nt i;.  int regL
4650: 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  eft = 0;.  int r
4660: 65 67 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 75  egRight = 0;.  u
4670: 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 69 6e  8 opx = op;.  in
4680: 74 20 61 64 64 72 44 6f 6e 65 20 3d 20 73 71 6c  t addrDone = sql
4690: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
46a0: 6c 28 76 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  l(v);..  assert(
46b0: 20 6e 4c 65 66 74 3d 3d 73 71 6c 69 74 65 33 45   nLeft==sqlite3E
46c0: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52  xprVectorSize(pR
46d0: 69 67 68 74 29 20 29 3b 0a 20 20 61 73 73 65 72  ight) );.  asser
46e0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
46f0: 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _EQ || pExpr->op
4700: 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20 20  ==TK_NE .       
4710: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4720: 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IS || pExpr->op
4730: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 20  ==TK_ISNOT .    
4740: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
4750: 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d  =TK_LT || pExpr-
4760: 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20  >op==TK_GT .    
4770: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
4780: 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d  =TK_LE || pExpr-
4790: 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29 3b  >op==TK_GE .  );
47a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
47b0: 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45 78  ->op==op || (pEx
47c0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26 26  pr->op==TK_IS &&
47d0: 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20 20   op==TK_EQ).    
47e0: 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78 70          || (pExp
47f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
4800: 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b  && op==TK_NE) );
4810: 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d 30  .  assert( p5==0
4820: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f   || pExpr->op!=o
4830: 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p );.  assert( p
4840: 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  5==SQLITE_NULLEQ
4850: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f   || pExpr->op==o
4860: 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53 51  p );..  p5 |= SQ
4870: 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20 20  LITE_STOREP2;.  
4880: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29  if( opx==TK_LE )
4890: 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20   opx = TK_LT;.  
48a0: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29  if( opx==TK_GE )
48b0: 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20   opx = TK_GT;.. 
48c0: 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72 43   regLeft = exprC
48d0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
48e0: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 72  rse, pLeft);.  r
48f0: 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43 6f  egRight = exprCo
4900: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
4910: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20 20  se, pRight);..  
4920: 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f 6f  for(i=0; 1 /*Loo
4930: 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65 61  p exits by "brea
4940: 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  k"*/; i++){.    
4950: 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
4960: 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  , regFree2 = 0;.
4970: 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a 70      Expr *pL, *p
4980: 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c 20  R; .    int r1, 
4990: 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r2;.    assert( 
49a0: 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74 20  i>=0 && i<nLeft 
49b0: 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29  );.    if( i>0 )
49c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
49d0: 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
49e0: 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63 74     r1 = exprVect
49f0: 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72 73  orRegister(pPars
4a00: 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65 67  e, pLeft, i, reg
4a10: 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67 46  Left, &pL, &regF
4a20: 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d 20  ree1);.    r2 = 
4a30: 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74  exprVectorRegist
4a40: 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  er(pParse, pRigh
4a50: 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c 20  t, i, regRight, 
4a60: 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29 3b  &pR, &regFree2);
4a70: 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65  .    codeCompare
4a80: 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c  (pParse, pL, pR,
4a90: 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65   opx, r1, r2, de
4aa0: 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65 73  st, p5);.    tes
4ab0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
4ac0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4ad0: 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
4ae0: 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d     testcase(op==
4af0: 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
4b00: 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
4b10: 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Le);.    testcas
4b20: 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
4b30: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
4b40: 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 74  p==OP_Gt);.    t
4b50: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
4b60: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
4b70: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
4b80: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
4b90: 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f  ==OP_Eq); VdbeCo
4ba0: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4bb0: 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74 63  P_Eq);.    testc
4bc0: 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
4bd0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4be0: 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
4bf0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
4c00: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
4c10: 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73 71  egFree1);.    sq
4c20: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4c30: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
4c40: 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20 69  ree2);.    if( i
4c50: 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  >0 ) sqlite3Expr
4c60: 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
4c70: 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65  ;.    if( i==nLe
4c80: 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62 72  ft-1 ){.      br
4c90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
4ca0: 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b  f( opx==TK_EQ ){
4cb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4cc0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4cd0: 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64 72  fNot, dest, addr
4ce0: 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Done); VdbeCover
4cf0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35  age(v);.      p5
4d00: 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e   |= SQLITE_KEEPN
4d10: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ULL;.    }else i
4d20: 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b  f( opx==TK_NE ){
4d30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4d40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4d50: 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  f, dest, addrDon
4d60: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
4d70: 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d  (v);.      p5 |=
4d80: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
4d90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4da0: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54     assert( op==T
4db0: 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LT || op==TK_G
4dc0: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  T || op==TK_LE |
4dd0: 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  | op==TK_GE );. 
4de0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4df0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73  AddOp2(v, OP_Els
4e00: 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72 44  eNotEq, 0, addrD
4e10: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  one);.      Vdbe
4e20: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
4e30: 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
4e40: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4e50: 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20  , op==TK_GT);.  
4e60: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
4e70: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29  If(v, op==TK_LE)
4e80: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
4e90: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
4ea0: 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  _GE);.      if( 
4eb0: 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78  i==nLeft-2 ) opx
4ec0: 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d   = op;.    }.  }
4ed0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
4ee0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
4ef0: 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20  drDone);.}..#if 
4f00: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
4f10: 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  DEPTH>0./*.** Ch
4f20: 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e  eck that argumen
4f30: 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73  t nHeight is les
4f40: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
4f50: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  to the maximum.*
4f60: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
4f70: 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69  th allowed. If i
4f80: 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20  t is not, leave 
4f90: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
4fa0: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a   in.** pParse..*
4fb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
4fc0: 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72  rCheckHeight(Par
4fd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
4fe0: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20  nHeight){.  int 
4ff0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5000: 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d    int mxHeight =
5010: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
5020: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
5030: 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20  _EXPR_DEPTH];.  
5040: 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65  if( nHeight>mxHe
5050: 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
5060: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5070: 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70  se, .       "Exp
5080: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
5090: 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d  too large (maxim
50a0: 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d  um depth %d)", m
50b0: 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20  xHeight.    );. 
50c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
50d0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
50e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  rn rc;.}../* The
50f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65   following three
5100: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67   functions, heig
5110: 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67  htOfExpr(), heig
5120: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a  htOfExprList().*
5130: 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65  * and heightOfSe
5140: 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64  lect(), are used
5150: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
5160: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
5170: 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65  .** of any expre
5180: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
5190: 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72  enced by the str
51a0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
51b0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72   the.** first ar
51c0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
51d0: 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65   this maximum he
51e0: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
51f0: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
5200: 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a   value pointed.*
5210: 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74  * to by pnHeight
5220: 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  , the second par
5230: 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74  ameter, then set
5240: 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68   *pnHeight to th
5250: 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a  at.** value..*/.
5260: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5270: 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70  htOfExpr(Expr *p
5280: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5290: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
52a0: 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e   if( p->nHeight>
52b0: 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20  *pnHeight ){.   
52c0: 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70     *pnHeight = p
52d0: 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d  ->nHeight;.    }
52e0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
52f0: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  id heightOfExprL
5300: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
5310: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5320: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5330: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5340: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
5350: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67  i++){.      heig
5360: 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d  htOfExpr(p->a[i]
5370: 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74  .pExpr, pnHeight
5380: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  );.    }.  }.}.s
5390: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
53a0: 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74  tOfSelect(Select
53b0: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
53c0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
53d0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
53e0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65  (p->pWhere, pnHe
53f0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5400: 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69  tOfExpr(p->pHavi
5410: 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  ng, pnHeight);. 
5420: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5430: 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69  p->pLimit, pnHei
5440: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5450: 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65  OfExpr(p->pOffse
5460: 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, pnHeight);.  
5470: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
5480: 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e  st(p->pEList, pn
5490: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
54a0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
54b0: 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69  >pGroupBy, pnHei
54c0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
54d0: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  OfExprList(p->pO
54e0: 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74  rderBy, pnHeight
54f0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  );.    heightOfS
5500: 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c  elect(p->pPrior,
5510: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a   pnHeight);.  }.
5520: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5530: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
5540: 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74  riable in the st
5550: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
5560: 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  s an .** argumen
5570: 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  t. An expression
5580: 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65   with no childre
5590: 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72  n, Expr.pList or
55a0: 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63   .** Expr.pSelec
55b0: 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68  t member has a h
55c0: 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20  eight of 1. Any 
55d0: 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
55e0: 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74  .** has a height
55f0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61   equal to the ma
5600: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20  ximum height of 
5610: 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65  any other .** re
5620: 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c  ferenced Expr pl
5630: 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  us one..**.** Al
5640: 73 6f 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f  so propagate EP_
5650: 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20  Propagate flags 
5660: 75 70 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70  up from Expr.x.p
5670: 4c 69 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61  List to Expr.fla
5680: 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70  gs,.** if approp
5690: 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
56a0: 20 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69   void exprSetHei
56b0: 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ght(Expr *p){.  
56c0: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
56d0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
56e0: 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67  p->pLeft, &nHeig
56f0: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  ht);.  heightOfE
5700: 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26  xpr(p->pRight, &
5710: 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20  nHeight);.  if( 
5720: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5730: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
5740: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
5750: 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c  Select(p->x.pSel
5760: 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ect, &nHeight);.
5770: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78    }else if( p->x
5780: 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65  .pList ){.    he
5790: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
57a0: 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69  ->x.pList, &nHei
57b0: 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  ght);.    p->fla
57c0: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
57d0: 74 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72  te & sqlite3Expr
57e0: 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70  ListFlags(p->x.p
57f0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  List);.  }.  p->
5800: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
5810: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
5820: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
5830: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
5840: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
5850: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
5860: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
5870: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
5880: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
5890: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
58a0: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
58b0: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
58c0: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  arse..**.** Also
58d0: 20 70 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   propagate all E
58e0: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
58f0: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
5900: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
5910: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
5920: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5930: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
5940: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
5950: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5960: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
5970: 72 65 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65  return;.  exprSe
5980: 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71  tHeight(p);.  sq
5990: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65  lite3ExprCheckHe
59a0: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  ight(pParse, p->
59b0: 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a  nHeight);.}../*.
59c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61  ** Return the ma
59d0: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20  ximum height of 
59e0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  any expression t
59f0: 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a  ree referenced.*
5a00: 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20  * by the select 
5a10: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
5a20: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
5a30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
5a40: 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
5a50: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
5a60: 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20  t nHeight = 0;. 
5a70: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5a80: 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  p, &nHeight);.  
5a90: 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a  return nHeight;.
5aa0: 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45  }.#else /* ABOVE
5ab0: 3a 20 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63  :  Height enforc
5ac0: 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20  ement enabled.  
5ad0: 42 45 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e  BELOW: Height en
5ae0: 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f  forcement off */
5af0: 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65  ./*.** Propagate
5b00: 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74   all EP_Propagat
5b10: 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65  e flags from the
5b20: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e   Expr.x.pList in
5b30: 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73  to.** Expr.flags
5b40: 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
5b50: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
5b60: 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70  ndFlags(Parse *p
5b70: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b  Parse, Expr *p){
5b80: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78  .  if( p && p->x
5b90: 2e 70 4c 69 73 74 20 26 26 20 21 45 78 70 72 48  .pList && !ExprH
5ba0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5bb0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
5bc0: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5bd0: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5be0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5bf0: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5c00: 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78    }.}.#define ex
5c10: 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23  prSetHeight(y).#
5c20: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5c30: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
5c40: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
5c50: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63  routine is the c
5c60: 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f  ore allocator fo
5c70: 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a  r Expr nodes..**
5c80: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
5c90: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
5ca0: 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ode and return a
5cb0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20   pointer to it. 
5cc0: 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74   Memory.** for t
5cd0: 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72  his node and for
5ce0: 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75   the pToken argu
5cf0: 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65  ment is a single
5d00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f   allocation.** o
5d10: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5d20: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20  ite3DbMalloc(). 
5d30: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
5d40: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70  ction.** is resp
5d50: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
5d60: 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65  ng sure the node
5d70: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
5d80: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
5d90: 20 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65   dequote is true
5da0: 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e  , then the token
5db0: 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
5dc0: 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20  is dequoted..** 
5dd0: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61  If dequote is fa
5de0: 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e  lse, no dequotin
5df0: 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  g is performed. 
5e00: 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20   The deQuote.** 
5e10: 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
5e20: 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69  ored if pToken i
5e30: 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  s NULL or if the
5e40: 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a   token does not.
5e50: 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20  ** appear to be 
5e60: 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20  quoted.  If the 
5e70: 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74  quotes were of t
5e80: 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64  he form "..." (d
5e90: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a  ouble-quotes).**
5ea0: 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c   then the EP_Dbl
5eb0: 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73  Quoted flag is s
5ec0: 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  et on the expres
5ed0: 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sion node..**.**
5ee0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   Special case:  
5ef0: 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  If op==TK_INTEGE
5f00: 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69  R and pToken poi
5f10: 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20  nts to a string 
5f20: 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74  that.** can be t
5f30: 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61  ranslated into a
5f40: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
5f50: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
5f60: 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64  is not.** stored
5f70: 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49   in u.zToken.  I
5f80: 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65  nstead, the inte
5f90: 67 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72  ger values is wr
5fa0: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e  itten.** into u.
5fb0: 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45  iValue and the E
5fc0: 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20  P_IntValue flag 
5fd0: 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72  is set.  No extr
5fe0: 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20  a storage.** is 
5ff0: 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
6000: 64 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65  d the integer te
6010: 78 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f  xt and the dequo
6020: 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72  te flag is ignor
6030: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
6040: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20  ite3ExprAlloc(. 
6050: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
6060: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
6070: 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62  le for sqlite3Db
6080: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61  MallocZero() (ma
6090: 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20  y be null) */.  
60a0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
60b0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
60c0: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
60d0: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
60e0: 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b  Token,    /* Tok
60f0: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69  en argument.  Mi
6100: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
6110: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
6120: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
6130: 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29   to dequote */.)
6140: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
6150: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
6160: 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d  ;.  int iValue =
6170: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64   0;..  assert( d
6180: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54  b!=0 );.  if( pT
6190: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
61a0: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
61b0: 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20  | pToken->z==0. 
61c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
61d0: 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b  te3GetInt32(pTok
61e0: 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d  en->z, &iValue)=
61f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  =0 ){.      nExt
6200: 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31  ra = pToken->n+1
6210: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6220: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20  iValue>=0 );.   
6230: 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20   }.  }.  pNew = 
6240: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6250: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
6260: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
6270: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
6280: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
6290: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
62a0: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28      pNew->op = (
62b0: 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  u8)op;.    pNew-
62c0: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
62d0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
62e0: 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d      if( nExtra==
62f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 ){.        pNe
6300: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
6310: 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
6320: 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
6330: 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  = iValue;.      
6340: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
6350: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
6360: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
6370: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6380: 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c   pToken->z!=0 ||
6390: 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b   pToken->n==0 );
63a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f  .        if( pTo
63b0: 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28  ken->n ) memcpy(
63c0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  pNew->u.zToken, 
63d0: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
63e0: 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  n->n);.        p
63f0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54  New->u.zToken[pT
6400: 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  oken->n] = 0;.  
6410: 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74        if( dequot
6420: 65 20 26 26 20 73 71 6c 69 74 65 33 49 73 71 75  e && sqlite3Isqu
6430: 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  ote(pNew->u.zTok
6440: 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  en[0]) ){.      
6450: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
6460: 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29  zToken[0]=='"' )
6470: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
6480: 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20  EP_DblQuoted;.  
6490: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
64a0: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
64b0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
64c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
64d0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
64e0: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20  XPR_DEPTH>0.    
64f0: 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20  pNew->nHeight = 
6500: 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a  1;.#endif  .  }.
6510: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
6520: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
6530: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
6540: 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65  n node from a ze
6550: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f  ro-terminated to
6560: 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20  ken that has.** 
6570: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 71  already been deq
6580: 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  uoted..*/.Expr *
6590: 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73  sqlite3Expr(.  s
65a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
65b0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
65c0: 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61   for sqlite3DbMa
65d0: 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20  llocZero() (may 
65e0: 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  be null) */.  in
65f0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6600: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6610: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6620: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b  const char *zTok
6630: 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  en      /* Token
6640: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
6650: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
6660: 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a    Token x;.  x.z
6670: 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e   = zToken;.  x.n
6680: 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69   = zToken ? sqli
6690: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b  te3Strlen30(zTok
66a0: 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  en) : 0;.  retur
66b0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
66c0: 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30  oc(db, op, &x, 0
66d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61  );.}../*.** Atta
66e0: 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65 66  ch subtrees pLef
66f0: 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20  t and pRight to 
6700: 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52  the Expr node pR
6710: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52  oot..**.** If pR
6720: 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  oot==NULL that m
6730: 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f  eans that a memo
6740: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
6750: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
6760: 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73  ..** In that cas
6770: 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73 75  e, delete the su
6780: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
6790: 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64   pRight..*/.void
67a0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
67b0: 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73 71  chSubtrees(.  sq
67c0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70  lite3 *db,.  Exp
67d0: 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72  r *pRoot,.  Expr
67e0: 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20   *pLeft,.  Expr 
67f0: 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28  *pRight.){.  if(
6800: 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20   pRoot==0 ){.   
6810: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
6820: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
6830: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6840: 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  te(db, pLeft);. 
6850: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6860: 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29  lete(db, pRight)
6870: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
6880: 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  f( pRight ){.   
6890: 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74     pRoot->pRight
68a0: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
68b0: 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d   pRoot->flags |=
68c0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
68d0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20  pRight->flags;. 
68e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
68f0: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
6900: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
6910: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66  ;.      pRoot->f
6920: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
6930: 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c  gate & pLeft->fl
6940: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  ags;.    }.    e
6950: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52 6f  xprSetHeight(pRo
6960: 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ot);.  }.}../*.*
6970: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78  * Allocate an Ex
6980: 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f  pr node which jo
6990: 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  ins as many as t
69a0: 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a  wo subtrees..**.
69b0: 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  ** One or both o
69c0: 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20 63  f the subtrees c
69d0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74  an be NULL.  Ret
69e0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
69f0: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72   the new.** Expr
6a00: 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61   node.  Or, if a
6a10: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
6a20: 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e  rs, set pParse->
6a30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6a40: 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75  ,.** free the su
6a50: 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75 72  btrees and retur
6a60: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20  n NULL..*/.Expr 
6a70: 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20  *sqlite3PExpr(. 
6a80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
6aa0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
6ab0: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
6ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
6ad0: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
6ae0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
6af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
6b00: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
6b10: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20  Expr *pRight,   
6b20: 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
6b30: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f   operand */.  co
6b40: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
6b50: 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e  n     /* Argumen
6b60: 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20  t token */.){.  
6b70: 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f  Expr *p;.  if( o
6b80: 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50 61  p==TK_AND && pPa
6b90: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
6ba0: 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61      /* Take adva
6bb0: 6e 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63  ntage of short-c
6bc0: 69 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74  ircuit false opt
6bd0: 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e  imization for AN
6be0: 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c  D */.    p = sql
6bf0: 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
6c00: 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70  se->db, pLeft, p
6c10: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
6c20: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
6c30: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
6c40: 2d 3e 64 62 2c 20 6f 70 20 26 20 54 4b 46 4c 47  ->db, op & TKFLG
6c50: 5f 4d 41 53 4b 2c 20 70 54 6f 6b 65 6e 2c 20 31  _MASK, pToken, 1
6c60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6c70: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
6c80: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20  (pParse->db, p, 
6c90: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
6ca0: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a    }.  if( p ) {.
6cb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6cc0: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
6cd0: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
6ce0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
6cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65  }../*.** Add pSe
6d00: 6c 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72  lect to the Expr
6d10: 2e 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64  .x.pSelect field
6d20: 2e 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20  .  Or, if pExpr 
6d30: 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20  is NULL (due.** 
6d40: 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  do a memory allo
6d50: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20  cation failure) 
6d60: 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
6d70: 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a  pSelect object..
6d80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
6d90: 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61  ExprAddSelect(Pa
6da0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
6db0: 72 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74  r *pExpr, Select
6dc0: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66   *pSelect){.  if
6dd0: 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ( pExpr ){.    p
6de0: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
6df0: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45  = pSelect;.    E
6e00: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
6e10: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
6e20: 63 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b  ct|EP_Subquery);
6e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
6e40: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
6e50: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  s(pParse, pExpr)
6e60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
6e70: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
6e80: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6e90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
6ea0: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
6eb0: 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  e->db, pSelect);
6ec0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  .  }.}.../*.** I
6ed0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6ee0: 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
6ef0: 72 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20  r TRUE or FALSE 
6f00: 28 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a  (respectively),.
6f10: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31  ** then return 1
6f20: 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  .  If one cannot
6f30: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74   determine the t
6f40: 72 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68  ruth value of th
6f50: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
6f60: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
6f70: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
6f80: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
6f90: 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20  ization.  If is 
6fa0: 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68  OK to return 0 h
6fb0: 65 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74  ere even if.** t
6fc0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
6fd0: 61 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66  ally is always f
6fe0: 61 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61  alse or false (a
6ff0: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29   false negative)
7000: 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61  ..** But it is a
7010: 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31   bug to return 1
7020: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
7030: 6f 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69  on might have di
7040: 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65  fferent.** boole
7050: 61 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66  an values in dif
7060: 66 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61  ferent circumsta
7070: 6e 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f  nces (a false po
7080: 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e  sitive.).**.** N
7090: 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20  ote that if the 
70a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61  expression is pa
70b0: 72 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61  rt of conditiona
70c0: 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20  l for a.** LEFT 
70d0: 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61  JOIN, then we ca
70e0: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61  nnot determine a
70f0: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
7100: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
7110: 20 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66   is it true or f
7120: 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20  alse, so always 
7130: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
7140: 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61  tic int exprAlwa
7150: 79 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b  ysTrue(Expr *p){
7160: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
7170: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
7180: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
7190: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
71a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
71b0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
71c0: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
71d0: 20 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a   return v!=0;.}.
71e0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
71f0: 6c 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20  lwaysFalse(Expr 
7200: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
7210: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
7220: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
7230: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
7240: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
7250: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
7260: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
7270: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30  0;.  return v==0
7280: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
7290: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
72a0: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
72b0: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
72c0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
72d0: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
72e0: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
72f0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
7300: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64  **.** If one sid
7310: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
7320: 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f  f the AND is kno
7330: 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20  wn to be false, 
7340: 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20  then instead.** 
7350: 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  of returning an 
7360: 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  AND expression, 
7370: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
7380: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
7390: 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75  n with.** a valu
73a0: 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45  e of false..*/.E
73b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
73c0: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
73d0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
73e0: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
73f0: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
7400: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
7410: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
7420: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
7430: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
7440: 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
7450: 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20  aysFalse(pLeft) 
7460: 7c 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  || exprAlwaysFal
7470: 73 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  se(pRight) ){.  
7480: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7490: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
74a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
74b0: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
74c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
74d0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
74e0: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
74f0: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
7500: 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  [0], 0);.  }else
7510: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
7520: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
7530: 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20  loc(db, TK_AND, 
7540: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
7550: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
7560: 72 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70  rees(db, pNew, p
7570: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
7580: 20 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a     return pNew;.
7590: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
75a0: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
75b0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
75c0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
75d0: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67   multiple.** arg
75e0: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20  uments..*/.Expr 
75f0: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63  *sqlite3ExprFunc
7600: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
7610: 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  se, ExprList *pL
7620: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
7630: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
7640: 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  w;.  sqlite3 *db
7650: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7660: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20   assert( pToken 
7670: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
7680: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
7690: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54   TK_FUNCTION, pT
76a0: 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20  oken, 1);.  if( 
76b0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
76c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
76d0: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
76e0: 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79   /* Avoid memory
76f0: 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f   leak when mallo
7700: 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72  c fails */.    r
7710: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
7720: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
7730: 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
7740: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
7750: 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c  (pNew, EP_xIsSel
7760: 65 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  ect) );.  sqlite
7770: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
7780: 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70  dFlags(pParse, p
7790: 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  New);.  return p
77a0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  New;.}../*.** As
77b0: 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20  sign a variable 
77c0: 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70  number to an exp
77d0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63  ression that enc
77e0: 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a  odes a wildcard.
77f0: 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ** in the origin
7800: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
7810: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  .  .**.** Wildca
7820: 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  rds consisting o
7830: 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61  f a single "?" a
7840: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
7850: 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a  next sequential.
7860: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  ** variable numb
7870: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  er..**.** Wildca
7880: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
7890: 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67  "?nnn" are assig
78a0: 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22  ned the number "
78b0: 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a  nnn".  We make.*
78c0: 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20  * sure "nnn" is 
78d0: 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76  not too be to av
78e0: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
78f0: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
7900: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
7910: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
7920: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
7930: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
7940: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
7950: 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61  orm ":aaa", "@aa
7960: 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72  a", or "$aaa" ar
7970: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
7980: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
7990: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
79a0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
79b0: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
79c0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
79d0: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
79e0: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
79f0: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
7a00: 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20  ential variable 
7a10: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
7a20: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
7a30: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
7a40: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
7a50: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
7a60: 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Expr){.  sqlite3
7a70: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7a80: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
7a90: 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  *z;..  if( pExpr
7aa0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7ab0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
7ac0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
7ad0: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
7ae0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
7af0: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
7b00: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
7b10: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
7b20: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
7b30: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d  =0 );.  if( z[1]
7b40: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==0 ){.    /* Wi
7b50: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
7b60: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
7b70: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
7b80: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
7b90: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f  assert( z[0]=='?
7ba0: 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ' );.    pExpr->
7bb0: 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72  iColumn = (ynVar
7bc0: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
7bd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7be0: 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20  ynVar x = 0;.   
7bf0: 20 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33   u32 n = sqlite3
7c00: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
7c10: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
7c20: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
7c30: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
7c40: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
7c50: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
7c60: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a  eger and.      *
7c70: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
7c80: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7c90: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a  */.      i64 i;.
7ca0: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20        int bOk = 
7cb0: 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34  0==sqlite3Atoi64
7cc0: 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c  (&z[1], &i, n-1,
7cd0: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
7ce0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
7cf0: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
7d00: 29 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  )i;.      testca
7d10: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
7d20: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
7d30: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7d40: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7d50: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7d60: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
7d70: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
7d80: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
7d90: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7da0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
7db0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
7dc0: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
7dd0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
7de0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
7df0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
7e00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7e10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
7e20: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
7e30: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
7e40: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
7e50: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
7e60: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7e70: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
7e80: 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b  ;.        x = 0;
7e90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7ea0: 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61  f( i>pParse->nVa
7eb0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
7ec0: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74  rse->nVar = (int
7ed0: 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
7ee0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
7ef0: 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22  Wildcards like "
7f00: 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72  :aaa", "$aaa" or
7f10: 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20   "@aaa".  Reuse 
7f20: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
7f30: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65  e.      ** numbe
7f40: 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61  r as the prior a
7f50: 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65  ppearance of the
7f60: 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69   same name, or i
7f70: 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20  f the name.     
7f80: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
7f90: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
7fa0: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
7fb0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
7fc0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56      */.      ynV
7fd0: 61 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  ar i;.      for(
7fe0: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
7ff0: 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  zVar; i++){.    
8000: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
8010: 61 7a 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63  azVar[i] && strc
8020: 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  mp(pParse->azVar
8030: 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  [i],z)==0 ){.   
8040: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
8050: 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56  olumn = x = (ynV
8060: 61 72 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20  ar)i+1;.        
8070: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
8080: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
8090: 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20   if( x==0 ) x = 
80a0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
80b0: 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73   (ynVar)(++pPars
80c0: 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a  e->nVar);.    }.
80d0: 20 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20      if( x>0 ){. 
80e0: 20 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73       if( x>pPars
80f0: 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20  e->nzVar ){.    
8100: 20 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20      char **a;.  
8110: 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65        a = sqlite
8120: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
8130: 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a  Parse->azVar, x*
8140: 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20  sizeof(a[0]));. 
8150: 20 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20         if( a==0 
8160: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
8170: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
8180: 61 69 6c 65 64 20 29 3b 20 2f 2a 20 45 72 72 6f  ailed ); /* Erro
8190: 72 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75  r reported throu
81a0: 67 68 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  gh mallocFailed 
81b0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
81c0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
81d0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
81e0: 7a 56 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20  zVar = a;.      
81f0: 20 20 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72    memset(&a[pPar
8200: 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28  se->nzVar], 0, (
8210: 78 2d 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29  x-pParse->nzVar)
8220: 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a  *sizeof(a[0]));.
8230: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
8240: 6e 7a 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20  nzVar = x;.     
8250: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30   }.      if( z[0
8260: 5d 21 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65  ]!='?' || pParse
8270: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20  ->azVar[x-1]==0 
8280: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8290: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 50 61  e3DbFree(db, pPa
82a0: 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29  rse->azVar[x-1])
82b0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
82c0: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73  ->azVar[x-1] = s
82d0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
82e0: 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  db, z, n);.     
82f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20   }.    }.  } .  
8300: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72  if( !pParse->nEr
8310: 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61  r && pParse->nVa
8320: 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
8330: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8340: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
8350: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8360: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8370: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
8380: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
8390: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
83a0: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
83b0: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  on tree..*/.stat
83c0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
83d0: 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  NE void sqlite3E
83e0: 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  xprDeleteNN(sqli
83f0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
8400: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
8410: 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  0 );.  /* Sanity
8420: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
8430: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
8440: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
8450: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
8460: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
8470: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8480: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
8490: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
84a0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
84b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
84c0: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
84d0: 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e  /* The Expr.x un
84e0: 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65  ion is never use
84f0: 64 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  d at the same ti
8500: 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68  me as Expr.pRigh
8510: 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
8520: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
8530: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
8540: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
8550: 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f  ft && p->op!=TK_
8560: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20  SELECT_COLUMN ) 
8570: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8580: 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  eNN(db, p->pLeft
8590: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
85a0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
85b0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  pRight);.    if(
85c0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
85d0: 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  (p, EP_MemToken)
85e0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
85f0: 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  (db, p->u.zToken
8600: 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
8610: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8620: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
8630: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
8640: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
8650: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
8660: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
8670: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8680: 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73  te(db, p->x.pLis
8690: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
86a0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
86b0: 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69  erty(p, EP_Stati
86c0: 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c) ){.    sqlite
86d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
86e0: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
86f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c  e3ExprDelete(sql
8700: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
8710: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71  p){.  if( p ) sq
8720: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8730: 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  N(db, p);.}../*.
8740: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
8750: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
8760: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
8770: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
8780: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
8790: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
87a0: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
87b0: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
87c0: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
87d0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
87e0: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
87f0: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
8800: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
8810: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
8820: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8830: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
8840: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
8850: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8860: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
8870: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
8880: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
8890: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
88a0: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
88b0: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
88c0: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
88d0: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
88e0: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
88f0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8900: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
8910: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
8920: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
8930: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8940: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
8950: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
8960: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
8970: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
8980: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8990: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
89a0: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
89b0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
89c0: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
89d0: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
89e0: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
89f0: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
8a00: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
8a10: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
8a20: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
8a30: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
8a40: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
8a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
8a90: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8aa0: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
8ab0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
8ac0: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
8ad0: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
8ae0: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
8af0: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
8b00: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
8b10: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
8b20: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
8b30: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
8b40: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
8b50: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
8b60: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
8b70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
8b80: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
8b90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
8ba0: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
8bb0: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
8bc0: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
8bd0: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
8be0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
8bf0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
8c00: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8c10: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
8c20: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
8c30: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
8c40: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
8c50: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
8c60: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
8c70: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
8c80: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
8c90: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
8ca0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
8cb0: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
8cc0: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
8cd0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
8ce0: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
8cf0: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
8d00: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
8d10: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
8d20: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
8d30: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
8d40: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
8d50: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
8d60: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
8d70: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
8d80: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
8d90: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
8da0: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
8db0: 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74   teh Expr object
8dc0: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
8dd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
8de0: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
8df0: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
8e00: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
8e10: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
8e20: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
8e30: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
8e40: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
8e50: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
8e60: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
8e70: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
8e80: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
8e90: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
8ea0: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
8eb0: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
8ec0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
8ed0: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
8ee0: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
8ef0: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
8f00: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
8f10: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
8f20: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
8f30: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
8f40: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
8f50: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
8f60: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
8f70: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
8f80: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
8f90: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
8fa0: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
8fb0: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
8fc0: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
8fd0: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
8fe0: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
8ff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
9000: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
9010: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
9020: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66  =0 );.  if( 0==f
9030: 6c 61 67 73 20 29 7b 0a 20 20 20 20 6e 53 69 7a  lags ){.    nSiz
9040: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
9050: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
9060: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9070: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
9080: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
9090: 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ced) );.    asse
90a0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
90b0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
90c0: 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73  oin) ); .    ass
90d0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
90e0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
90f0: 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73  oken) );.    ass
9100: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9110: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
9120: 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28  duce) );.    if(
9130: 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e   p->pLeft || p->
9140: 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  x.pList ){.     
9150: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45   nSize = EXPR_RE
9160: 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52  DUCEDSIZE | EP_R
9170: 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73  educed;.    }els
9180: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
9190: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
91a0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
91b0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
91c0: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
91d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
91e0: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
91f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9200: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
9210: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
9220: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
9230: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
9240: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
9250: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
9260: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
9270: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
9280: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
9290: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
92a0: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
92b0: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
92c0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
92d0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
92e0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
92f0: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
9300: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
9310: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9320: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
9330: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
9340: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
9350: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
9360: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
9370: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
9380: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
9390: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
93a0: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
93b0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
93c0: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
93d0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
93e0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
93f0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
9400: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
9410: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
9420: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
9430: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
9440: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
9450: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
9460: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
9470: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
9480: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
9490: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
94a0: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
94b0: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
94c0: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
94d0: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
94e0: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
94f0: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
9500: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
9510: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
9520: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
9530: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
9540: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
9550: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
9560: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
9570: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
9580: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
9590: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
95a0: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
95b0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
95c0: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
95d0: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
95e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
95f0: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
9600: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
9610: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
9620: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
9630: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
9640: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
9650: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
9660: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
9670: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
9680: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
9690: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
96a0: 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53  gs) + dupedExprS
96b0: 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66  ize(p->pRight, f
96c0: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
96d0: 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b  .  return nByte;
96e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
96f0: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
9700: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ar to sqlite3Exp
9710: 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74  rDup(), except t
9720: 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20  hat if pzBuffer 
9730: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  .** is not NULL 
9740: 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69  then *pzBuffer i
9750: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
9760: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c  nt to a buffer l
9770: 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20  arge enough .** 
9780: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
9790: 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
97a0: 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  p, the copies of
97b0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20   p->u.zToken.** 
97c0: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
97d0: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
97e0: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
97f0: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
9800: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
9810: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
9820: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
9830: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
9840: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
9850: 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f  the.** portion o
9860: 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70  f the buffer cop
9870: 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73  ied into by this
9880: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
9890: 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44  atic Expr *exprD
98a0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
98b0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 64 75 70  Expr *p, int dup
98c0: 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75  Flags, u8 **pzBu
98d0: 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70  ffer){.  Expr *p
98e0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
98f0: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
9900: 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f  n */.  u8 *zAllo
9910: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
9920: 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 66 72 6f  Memory space fro
9930: 6d 20 77 68 69 63 68 20 74 6f 20 62 75 69 6c 64  m which to build
9940: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a   Expr object */.
9950: 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67    u32 staticFlag
9960: 3b 20 20 20 20 20 20 20 2f 2a 20 45 50 5f 53 74  ;       /* EP_St
9970: 61 74 69 63 20 69 66 20 73 70 61 63 65 20 6e 6f  atic if space no
9980: 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
9990: 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73  malloc */..  ass
99a0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
99b0: 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61  assert( p );.  a
99c0: 73 73 65 72 74 28 20 64 75 70 46 6c 61 67 73 3d  ssert( dupFlags=
99d0: 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d  =0 || dupFlags==
99e0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
99f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 42 75  ;.  assert( pzBu
9a00: 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c  ffer==0 || dupFl
9a10: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
9a20: 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  UCE );..  /* Fig
9a30: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f  ure out where to
9a40: 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45   write the new E
9a50: 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a  xpr structure. *
9a60: 2f 0a 20 20 69 66 28 20 70 7a 42 75 66 66 65 72  /.  if( pzBuffer
9a70: 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d   ){.    zAlloc =
9a80: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
9a90: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f  staticFlag = EP_
9aa0: 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b  Static;.  }else{
9ab0: 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71  .    zAlloc = sq
9ac0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
9ad0: 4e 4e 28 64 62 2c 20 64 75 70 65 64 45 78 70 72  NN(db, dupedExpr
9ae0: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
9af0: 29 29 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c  ));.    staticFl
9b00: 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  ag = 0;.  }.  pN
9b10: 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c  ew = (Expr *)zAl
9b20: 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77  loc;..  if( pNew
9b30: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e   ){.    /* Set n
9b40: 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73  NewSize to the s
9b50: 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ize allocated fo
9b60: 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  r the structure 
9b70: 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a  pointed to.    *
9b80: 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20  * by pNew. This 
9b90: 69 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46  is either EXPR_F
9ba0: 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45  ULLSIZE, EXPR_RE
9bb0: 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20  DUCEDSIZE or.   
9bc0: 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   ** EXPR_TOKENON
9bd0: 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69  LYSIZE. nToken i
9be0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
9bf0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e  ber of bytes con
9c00: 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  sumed.    ** by 
9c10: 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
9c20: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
9c30: 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  ng (if any)..   
9c40: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
9c50: 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69  signed nStructSi
9c60: 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  ze = dupedExprSt
9c70: 72 75 63 74 53 69 7a 65 28 70 2c 20 64 75 70 46  ructSize(p, dupF
9c80: 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74  lags);.    const
9c90: 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20   int nNewSize = 
9ca0: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 30 78  nStructSize & 0x
9cb0: 66 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f  fff;.    int nTo
9cc0: 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 21 45 78  ken;.    if( !Ex
9cd0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9ce0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9cf0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9d00: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73        nToken = s
9d10: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
9d20: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b  ->u.zToken) + 1;
9d30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9d40: 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20    nToken = 0;.  
9d50: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 75 70 46    }.    if( dupF
9d60: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 61 73  lags ){.      as
9d70: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
9d80: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
9d90: 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ced)==0 );.     
9da0: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
9db0: 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20  p, nNewSize);.  
9dc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
9dd0: 33 32 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29  32 nSize = (u32)
9de0: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
9df0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
9e00: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65  zAlloc, p, nSize
9e10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69  );.      if( nSi
9e20: 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  ze<EXPR_FULLSIZE
9e30: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 6d 65 6d   ){ .        mem
9e40: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
9e50: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
9e60: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
9e70: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
9e80: 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65  /* Set the EP_Re
9e90: 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f  duced, EP_TokenO
9ea0: 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74  nly, and EP_Stat
9eb0: 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72  ic flags appropr
9ec0: 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70  iately. */.    p
9ed0: 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28  New->flags &= ~(
9ee0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9ef0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69  kenOnly|EP_Stati
9f00: 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a  c|EP_MemToken);.
9f10: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
9f20: 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26  |= nStructSize &
9f30: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
9f40: 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20  TokenOnly);.    
9f50: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73  pNew->flags |= s
9f60: 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20  taticFlag;..    
9f70: 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75  /* Copy the p->u
9f80: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20  .zToken string, 
9f90: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
9fa0: 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( nToken ){.   
9fb0: 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20     char *zToken 
9fc0: 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  = pNew->u.zToken
9fd0: 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f   = (char*)&zAllo
9fe0: 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20  c[nNewSize];.   
9ff0: 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e     memcpy(zToken
a000: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e  , p->u.zToken, n
a010: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  Token);.    }.. 
a020: 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66     if( 0==((p->f
a030: 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73  lags|pNew->flags
a040: 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ) & EP_TokenOnly
a050: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
a060: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
a070: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
a080: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
a090: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
a0a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a0b0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
a0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a0d0: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
a0e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a0f0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
a100: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a120: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
a130: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a140: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
a150: 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  st, dupFlags);. 
a160: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a170: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
a180: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
a190: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
a1a0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a1b0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
a1c0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a1d0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  nly) ){.      zA
a1e0: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a1f0: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a200: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a210: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a220: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
a230: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ed) ){.        p
a240: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e  New->pLeft = p->
a250: 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20 20  pLeft ?.        
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
a270: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
a280: 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ft, EXPRDUP_REDU
a290: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30  CE, &zAlloc) : 0
a2a0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
a2b0: 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67  pRight = p->pRig
a2c0: 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  ht ?.           
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72              expr
a2e0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  Dup(db, p->pRigh
a2f0: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
a300: 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b  E, &zAlloc) : 0;
a310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a320: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
a330: 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72         *pzBuffer
a340: 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = zAlloc;.     
a350: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
a360: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a370: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
a380: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
a390: 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f       if( pNew->o
a3a0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
a3b0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
a3c0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
a3d0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
a3e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a3f0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
a400: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a410: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
a420: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a430: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a440: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a450: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
a460: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
a470: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
a480: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
a490: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
a4a0: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
a4b0: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
a4c0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
a4d0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
a4e0: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
a4f0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
a500: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
a510: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
a520: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
a530: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
a540: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
a550: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
a560: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
a570: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
a580: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
a590: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
a5a0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
a5b0: 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28  of(*p) + sizeof(
a5c0: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
a5d0: 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74  Cte-1);.    pRet
a5e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a5f0: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
a600: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  );.    if( pRet 
a610: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
a620: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65        pRet->nCte
a630: 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20   = p->nCte;.    
a640: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a650: 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
a660: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70      pRet->a[i].p
a670: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
a680: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
a690: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30  >a[i].pSelect, 0
a6a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
a6b0: 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71  >a[i].pCols = sq
a6c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a6d0: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f  (db, p->a[i].pCo
a6e0: 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ls, 0);.        
a6f0: 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pRet->a[i].zName
a700: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
a710: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  up(db, p->a[i].z
a720: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
a730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a740: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
a750: 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70  # define withDup
a760: 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a  (x,y) 0.#endif..
a770: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a780: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
a790: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
a7a0: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
a7b0: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
a7c0: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
a7d0: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
a7e0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
a7f0: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
a800: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
a810: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
a820: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
a830: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
a840: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
a850: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
a860: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
a870: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
a880: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
a890: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
a8a0: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
a8b0: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
a8c0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
a8d0: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
a8e0: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
a8f0: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
a900: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
a910: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
a920: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
a930: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
a940: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
a950: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
a960: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
a970: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
a980: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
a990: 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
a9a0: 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74  tains a combinat
a9b0: 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44  ion of the EXPRD
a9c0: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
a9d0: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
a9e0: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
a9f0: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  et, then the str
aa00: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
aa10: 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65  is a.** truncate
aa20: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
aa30: 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75   usual Expr stru
aa40: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
aa50: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
aa60: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
aa70: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
aa80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
aa90: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  base schema..*/.
aaa0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
aab0: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
aac0: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
aad0: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
aae0: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
aaf0: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
ab00: 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  CE );.  return p
ab10: 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   ? exprDup(db, p
ab20: 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b  , flags, 0) : 0;
ab30: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
ab40: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
ab50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
ab60: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  rList *p, int fl
ab70: 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ags){.  ExprList
ab80: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
ab90: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
aba0: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
abb0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
abc0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
abd0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
abe0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
abf0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
ac00: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
ac10: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
ac20: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
ac30: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
ac40: 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  = i = p->nExpr;.
ac50: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 45    if( (flags & E
ac60: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d  XPRDUP_REDUCE)==
ac70: 30 20 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  0 ) for(i=1; i<p
ac80: 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d  ->nExpr; i+=i){}
ac90: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74  .  pNew->a = pIt
aca0: 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  em = sqlite3DbMa
acb0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20 69  llocRawNN(db,  i
acc0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
acd0: 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d   );.  if( pItem=
ace0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
acf0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77  3DbFree(db, pNew
ad00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
ad10: 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d  .  } .  pOldItem
ad20: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
ad30: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
ad40: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
ad50: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
ad60: 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20  xpr *pOldExpr = 
ad70: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b  pOldItem->pExpr;
ad80: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
ad90: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
ada0: 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c  up(db, pOldExpr,
adb0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74   flags);.    pIt
adc0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
add0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
ade0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
adf0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
ae00: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
ae10: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
ae20: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
ae30: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
ae40: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
ae50: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
ae60: 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ->done = 0;.    
ae70: 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  pItem->bSpanIsTa
ae80: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53  b = pOldItem->bS
ae90: 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49  panIsTab;.    pI
aea0: 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65  tem->u = pOldIte
aeb0: 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75  m->u;.  }.  retu
aec0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
aed0: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
aee0: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
aef0: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
af00: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
af10: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
af20: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
af30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
af40: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
af50: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
af60: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
af70: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
af80: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
af90: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
afa0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
afb0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
afc0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
afd0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
afe0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
aff0: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
b000: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b010: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
b020: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
b030: 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  rcListDup(sqlite
b040: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
b050: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
b060: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
b070: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
b080: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
b090: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
b0a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b0b0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
b0c0: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
b0d0: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
b0e0: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
b0f0: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
b100: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b110: 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20  RawNN(db, nByte 
b120: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
b130: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b140: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
b150: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
b160: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
b170: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
b180: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
b190: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
b1a0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
b1b0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
b1c0: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
b1d0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
b1e0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
b1f0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
b200: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
b210: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
b220: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
b230: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
b240: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b250: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
b260: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
b270: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
b280: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b290: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
b2a0: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
b2b0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b2c0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b2d0: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
b2e0: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
b2f0: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
b300: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
b310: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
b320: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
b330: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
b340: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
b350: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
b360: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
b370: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
b380: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
b390: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
b3a0: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
b3b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
b3c0: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
b3d0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
b3e0: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
b3f0: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
b400: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
b410: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
b420: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
b430: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
b440: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
b450: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
b460: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
b470: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b480: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
b490: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
b4a0: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
b4b0: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
b4c0: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
b4d0: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
b4e0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
b4f0: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
b500: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
b510: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
b520: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b530: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b540: 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b  pSelect, flags);
b550: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
b560: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
b570: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b580: 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20  ->pOn, flags);. 
b590: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
b5a0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
b5b0: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
b5c0: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
b5d0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
b5e0: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
b5f0: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
b600: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
b610: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
b620: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
b630: 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a  db, IdList *p){.
b640: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
b650: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
b660: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
b670: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
b680: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
b690: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b6a0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
b6b0: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
b6c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b6d0: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
b6e0: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
b6f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
b700: 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49  cRawNN(db, p->nI
b710: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
b720: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
b730: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
b740: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
b750: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
b760: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74   0;.  }.  /* Not
b770: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74  e that because t
b780: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
b790: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d  llocation for p-
b7a0: 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  >a[] is not.  **
b7b0: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70   necessarily a p
b7c0: 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c  ower of two, sql
b7d0: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
b7e0: 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61  () may not be ca
b7f0: 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lled.  ** on the
b800: 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74   duplicate creat
b810: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
b820: 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ion. */.  for(i=
b830: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
b840: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
b850: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
b860: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
b870: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
b880: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
b890: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
b8a0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
b8b0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
b8c0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b8d0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
b8e0: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
b8f0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
b900: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
b910: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
b920: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
b930: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
b940: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
b950: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c  .  Select *pNew,
b960: 20 2a 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65   *pPrior;.  asse
b970: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
b980: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b990: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
b9a0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b9b0: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29  N(db, sizeof(*p)
b9c0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
b9d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b9e0: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
b9f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
ba00: 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
ba10: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
ba20: 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
ba30: 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  rcListDup(db, p-
ba40: 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20  >pSrc, flags);. 
ba50: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
ba60: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
ba70: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c  b, p->pWhere, fl
ba80: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  ags);.  pNew->pG
ba90: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
baa0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
bab0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
bac0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  gs);.  pNew->pHa
bad0: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
bae0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
baf0: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
bb00: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
bb10: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
bb20: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
bb30: 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  rBy, flags);.  p
bb40: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
bb50: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
bb60: 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  = pPrior = sqlit
bb70: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
bb80: 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73  p->pPrior, flags
bb90: 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20  );.  if( pPrior 
bba0: 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
bbb0: 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
bbc0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65  pNext = 0;.  pNe
bbd0: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
bbe0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
bbf0: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
bc00: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
bc10: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
bc20: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
bc30: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
bc40: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
bc50: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
bc60: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46   0;.  pNew->selF
bc70: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
bc80: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
bc90: 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e  emeral;.  pNew->
bca0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
bcb0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
bcc0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
bcd0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c  -1;.  pNew->nSel
bce0: 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c  ectRow = p->nSel
bcf0: 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e  ectRow;.  pNew->
bd00: 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28  pWith = withDup(
bd10: 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20  db, p->pWith);. 
bd20: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
bd30: 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a  tName(pNew, p->z
bd40: 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  SelName);.  retu
bd50: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
bd60: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
bd70: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
bd80: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
bd90: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
bda0: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
bdb0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
bdc0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
bdd0: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
bde0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
bdf0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
be00: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
be10: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
be20: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
be30: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
be40: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
be50: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
be60: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
be70: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
be80: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
be90: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
bea0: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
beb0: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
bec0: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
bed0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
bee0: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
bef0: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
bf00: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
bf10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
bf20: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
bf30: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
bf40: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
bf50: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
bf60: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
bf70: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
bf80: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
bf90: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
bfa0: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
bfb0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
bfc0: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
bfd0: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
bfe0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
bff0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c000: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
c010: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
c020: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
c030: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
c040: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
c050: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
c060: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
c070: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
c080: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
c090: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
c0a0: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d   = 0;.    pList-
c0b0: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
c0c0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c0d0: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
c0e0: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
c0f0: 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  t->a==0 ) goto n
c100: 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69  o_mem;.  }else i
c110: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
c120: 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72   & (pList->nExpr
c130: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  -1))==0 ){.    s
c140: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c150: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65  tem *a;.    asse
c160: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
c170: 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71  >0 );.    a = sq
c180: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
c190: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  b, pList->a, pLi
c1a0: 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65  st->nExpr*2*size
c1b0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
c1c0: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
c1d0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
c1e0: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
c1f0: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
c200: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
c210: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
c220: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
c230: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
c240: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
c250: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
c260: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
c270: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
c280: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
c290: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
c2a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
c2b0: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
c2c0: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
c2d0: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
c2e0: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
c2f0: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
c300: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
c310: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
c320: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
c330: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
c340: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c350: 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78  pColumns and pEx
c360: 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72  pr form a vector
c370: 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63   assignment whic
c380: 68 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  h is part of the
c390: 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f   SET.** clause o
c3a0: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
c3b0: 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69  ement.  Like thi
c3c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
c3d0: 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31  (a,b,c) = (expr1
c3e0: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
c3f0: 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20   Or:    (a,b,c) 
c400: 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20  = (SELECT x,y,z 
c410: 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  FROM ....).**.**
c420: 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f   For each term o
c430: 66 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73  f the vector ass
c440: 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20  ignment, append 
c450: 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74  new entries to t
c460: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
c470: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e   list pList.  In
c480: 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73   the case of a s
c490: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 4c  ubquery on the L
c4a0: 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b  HS, append.** TK
c4b0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65  _SELECT_COLUMN e
c4c0: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45  xpressions..*/.E
c4d0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
c4e0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65  ExprListAppendVe
c4f0: 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ctor(.  Parse *p
c500: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
c510: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c520: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
c530: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  *pList,       /*
c540: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
c550: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
c560: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c  be NULL */.  IdL
c570: 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20  ist *pColumns,  
c580: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e      /* List of n
c590: 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74  ames of LHS of t
c5a0: 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f  he assignment */
c5b0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
c5c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63            /* Vec
c5d0: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74  tor expression t
c5e0: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
c5f0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c600: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c610: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c620: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b   int n;.  int i;
c630: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
c640: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
c650: 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70  Expr : 0;.  /* p
c660: 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79  Columns can only
c670: 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20   be NULL due to 
c680: 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f  an OOM but an OO
c690: 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a  M will cause an.
c6a0: 20 20 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20    ** exit prior 
c6b0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
c6c0: 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f  being invoked */
c6d0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f  .  if( NEVER(pCo
c6e0: 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f  lumns==0) ) goto
c6f0: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
c700: 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70  rror;.  if( pExp
c710: 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74  r==0 ) goto vect
c720: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
c730: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  .  n = sqlite3Ex
c740: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
c750: 70 72 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 75  pr);.  if( pColu
c760: 6d 6e 73 2d 3e 6e 49 64 21 3d 6e 20 29 7b 0a 20  mns->nId!=n ){. 
c770: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c780: 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63  sg(pParse, "%d c
c790: 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20  olumns assigned 
c7a0: 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20  %d values",.    
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e  pColumns->nId, n
c7d0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65 63 74  );.    goto vect
c7e0: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
c7f0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
c800: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  i<n; i++){.    E
c810: 78 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20  xpr *pSubExpr = 
c820: 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65  sqlite3ExprForVe
c830: 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65  ctorField(pParse
c840: 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20  , pExpr, i);.   
c850: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
c860: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
c870: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53  Parse, pList, pS
c880: 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ubExpr);.    if(
c890: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
c8a0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
c8b0: 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31  Expr==iFirst+i+1
c8c0: 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   );.      pList-
c8d0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
c8e0: 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75  1].zName = pColu
c8f0: 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  mns->a[i].zName;
c900: 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d  .      pColumns-
c910: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b  >a[i].zName = 0;
c920: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c930: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
c940: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 69 66 28  ELECT ){.    if(
c950: 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d   pList && pList-
c960: 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72  >a[iFirst].pExpr
c970: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c980: 28 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73  ( pList->a[iFirs
c990: 74 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t].pExpr->op==TK
c9a0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
c9b0: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ;.      pList->a
c9c0: 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 2d 3e  [iFirst].pExpr->
c9d0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a  pRight = pExpr;.
c9e0: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b        pExpr = 0;
c9f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 76 65 63 74  .    }.  }..vect
ca00: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a  or_append_error:
ca10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
ca20: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
ca30: 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
ca40: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75  Delete(db, pColu
ca50: 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  mns);.  return p
ca60: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  List;.}../*.** S
ca70: 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  et the sort orde
ca80: 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65  r for the last e
ca90: 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69  lement on the gi
caa0: 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f  ven ExprList..*/
cab0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
cac0: 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65  rListSetSortOrde
cad0: 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  r(ExprList *p, i
cae0: 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a  nt iSortOrder){.
caf0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
cb00: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53  urn;.  assert( S
cb10: 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e  QLITE_SO_UNDEFIN
cb20: 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53  ED<0 && SQLITE_S
cb30: 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49  O_ASC>=0 && SQLI
cb40: 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a  TE_SO_DESC>0 );.
cb50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78    assert( p->nEx
cb60: 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53  pr>0 );.  if( iS
cb70: 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20  ortOrder<0 ){.  
cb80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70    assert( p->a[p
cb90: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f  ->nExpr-1].sortO
cba0: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
cbb0: 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ASC );.    retur
cbc0: 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d  n;.  }.  p->a[p-
cbd0: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
cbe0: 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f  der = (u8)iSortO
cbf0: 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rder;.}../*.** S
cc00: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
cc10: 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e  a[].zName elemen
cc20: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
cc30: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
cc40: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
cc50: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
cc60: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
cc70: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
cc80: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
cc90: 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64  But pName should
cca0: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
ccb0: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
ccc0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
ccd0: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
cce0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
ccf0: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
cd00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
cd10: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20  prListSetName(. 
cd20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
cd30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
cd40: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
cd50: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
cd60: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
cd70: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
cd80: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
cd90: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
cda0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
cdb0: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20  to be added */. 
cdc0: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
cdd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
cde0: 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61   to cause the na
cdf0: 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65  me to be dequote
ce00: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
ce10: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50  ( pList!=0 || pP
ce20: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
ce30: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
ce40: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
ce50: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
ce60: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
ce70: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
ce80: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70  nExpr>0 );.    p
ce90: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
cea0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
ceb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
cec0: 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b  tem->zName==0 );
ced0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
cee0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
cef0: 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  NDup(pParse->db,
cf00: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
cf10: 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65  ->n);.    if( de
cf20: 71 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44  quote ) sqlite3D
cf30: 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e  equote(pItem->zN
cf40: 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ame);.  }.}../*.
cf50: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c  ** Set the ExprL
cf60: 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c  ist.a[].zSpan el
cf70: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73  ement of the mos
cf80: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
cf90: 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20   item.** on the 
cfa0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
cfb0: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67  .**.** pList mig
cfc0: 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f  ht be NULL follo
cfd0: 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  wing an OOM erro
cfe0: 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68  r.  But pSpan sh
cff0: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a  ould never be.**
d000: 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d   NULL.  If a mem
d010: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
d020: 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65  ails, the pParse
d030: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
d040: 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65  ed flag.** is se
d050: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d060: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61  e3ExprListSetSpa
d070: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
d080: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
d090: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d0a0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d0b0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
d0c0: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
d0d0: 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a   add the span. *
d0e0: 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53  /.  ExprSpan *pS
d0f0: 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54  pan         /* T
d100: 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64  he span to be ad
d110: 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ded */.){.  sqli
d120: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d130: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
d140: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e  pList!=0 || db->
d150: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
d160: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
d170: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
d180: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
d190: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
d1a0: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
d1b0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
d1c0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
d1d0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
d1e0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74  locFailed || pIt
d1f0: 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e  em->pExpr==pSpan
d200: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73  ->pExpr );.    s
d210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d220: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
d230: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
d240: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
d250: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
d260: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20  Span->zStart,.  
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a    (int)(pSpan->z
d2a0: 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74  End - pSpan->zSt
d2b0: 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  art));.  }.}../*
d2c0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
d2d0: 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73  ssion list pELis
d2e0: 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  t contains more 
d2f0: 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d  than iLimit elem
d300: 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  ents,.** leave a
d310: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
d320: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
d330: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
d340: 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20  stCheckLength(. 
d350: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
d360: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
d370: 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  st,.  const char
d380: 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69   *zObject.){.  i
d390: 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e  nt mx = pParse->
d3a0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
d3b0: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b  E_LIMIT_COLUMN];
d3c0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
d3d0: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
d3e0: 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65  Expr==mx );.  te
d3f0: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
d400: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
d410: 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  =mx+1 );.  if( p
d420: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
d430: 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20  >nExpr>mx ){.   
d440: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d450: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
d460: 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73  ny columns in %s
d470: 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d  ", zObject);.  }
d480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
d490: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
d4a0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73  ssion list..*/.s
d4b0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
d4c0: 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c  NLINE void exprL
d4d0: 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  istDeleteNN(sqli
d4e0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
d4f0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
d500: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
d510: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
d520: 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  m;.  assert( pLi
d530: 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73  st->a!=0 || pLis
d540: 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20  t->nExpr==0 );. 
d550: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
d560: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
d570: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
d580: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
d590: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
d5a0: 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  b, pItem->pExpr)
d5b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
d5c0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
d5d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
d5e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
d5f0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a  em->zSpan);.  }.
d600: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d610: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
d620: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d630: 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69  b, pList);.}.voi
d640: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
d650: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
d660: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
d670: 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69  List){.  if( pLi
d680: 73 74 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c  st ) exprListDel
d690: 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29  eteNN(db, pList)
d6a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
d6b0: 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52  n the bitwise-OR
d6c0: 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61   of all Expr.fla
d6d0: 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  gs fields in the
d6e0: 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69   given.** ExprLi
d6f0: 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  st..*/.u32 sqlit
d700: 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
d710: 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a  const ExprList *
d720: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
d730: 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20  .  u32 m = 0;.  
d740: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
d750: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
d760: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
d770: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
d780: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
d790: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 61  .pExpr;.       a
d7a0: 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
d7b0: 29 3b 0a 20 20 20 20 20 20 20 6d 20 7c 3d 20 70  );.       m |= p
d7c0: 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Expr->flags;.   
d7d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
d7e0: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  m;.}../*.** Thes
d7f0: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57  e routines are W
d800: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  alker callbacks 
d810: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78  used to check ex
d820: 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20  pressions to.** 
d830: 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20  see if they are 
d840: 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73  "constant" for s
d850: 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ome definition o
d860: 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65  f constant.  The
d870: 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  .** Walker.eCode
d880: 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65   value determine
d890: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63  s the type of "c
d8a0: 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20  onstant" we are 
d8b0: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a  looking.** for..
d8c0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
d8d0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
d8e0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
d8f0: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
d900: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
d910: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
d920: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
d930: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
d940: 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73  Code==1.**     s
d950: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
d960: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20  tantNotJoin()   
d970: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
d980: 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20  >eCode==2.**    
d990: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
d9a0: 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  bleConstant()   
d9b0: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
d9c0: 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20  r->eCode==3.**  
d9d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
d9e0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
d9f0: 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c  on()        pWal
da00: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
da10: 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20   5.**.** In all 
da20: 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62  cases, the callb
da30: 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e  acks set Walker.
da40: 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72  eCode=0 and abor
da50: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
da60: 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20  ion.** is found 
da70: 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73  to not be a cons
da80: 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tant..**.** The 
da90: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
daa0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
dab0: 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76  ) is used for ev
dac0: 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73  aluating express
dad0: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45  ions.** in a CRE
dae0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
daf0: 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72  ent.  The Walker
db00: 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20  .eCode value is 
db10: 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a  5 when parsing.*
db20: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63  * an existing sc
db30: 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20  hema and 4 when 
db40: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77  processing a new
db50: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62   statement.  A b
db60: 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
db70: 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f  r raises an erro
db80: 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d  r for new statem
db90: 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c  ents, but is sil
dba0: 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a  ently converted.
dbb0: 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65  ** to NULL for e
dbc0: 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e  xisting schemas.
dbd0: 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71    This allows sq
dbe0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
dbf0: 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74  es that .** cont
dc00: 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61  ain a bound para
dc10: 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68  meter because th
dc20: 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65  ey were generate
dc30: 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
dc40: 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
dc50: 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79   to be parsed by
dc60: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
dc70: 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75  of SQLite withou
dc80: 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d  t raising a.** m
dc90: 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20  alformed schema 
dca0: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
dcb0: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
dcc0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
dcd0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
dce0: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
dcf0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69  pWalker->eCode i
dd00: 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 2 then any ter
dd10: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
dd20: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
dd30: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
dd40: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
dd50: 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
dd60: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
dd70: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
dd80: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
dd90: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
dda0: 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65   */.  if( pWalke
ddb0: 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45  r->eCode==2 && E
ddc0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ddd0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
dde0: 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  n) ){.    pWalke
ddf0: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
de00: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
de10: 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rt;.  }..  switc
de20: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
de30: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
de40: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
de50: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
de60: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
de70: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
de80: 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70   ** and either p
de90: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
dea0: 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e   or 5 or the fun
deb0: 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20  ction has the.  
dec0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43    ** SQLITE_FUNC
ded0: 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a  _CONST flag. */.
dee0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
def0: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  TION:.      if( 
df00: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d  pWalker->eCode>=
df10: 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  4 || ExprHasProp
df20: 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f  erty(pExpr,EP_Co
df30: 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  nstFunc) ){.    
df40: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
df50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
df60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57  else{.        pW
df70: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
df80: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
df90: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
dfa0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
dfb0: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
dfc0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
dfd0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
dfe0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
dff0: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
e000: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e010: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
e020: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e030: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
e040: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
e050: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
e060: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
e070: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e080: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
e090: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
e0a0: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
e0b0: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
e0c0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
e0d0: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
e0e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e0f0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
e100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e110: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
e120: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
e130: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
e140: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73  .      }.    cas
e150: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
e160: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
e170: 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20  ->eCode==5 ){.  
e180: 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c        /* Silentl
e190: 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20  y convert bound 
e1a0: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
e1b0: 61 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66  appear inside of
e1c0: 20 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20   CREATE.        
e1d0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ** statements in
e1e0: 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70  to a NULL when p
e1f0: 61 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54  arsing the CREAT
e200: 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74  E statement text
e210: 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   out.        ** 
e220: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  of the sqlite_ma
e230: 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
e240: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
e250: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  = TK_NULL;.     
e260: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b   }else if( pWalk
e270: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a  er->eCode==4 ){.
e280: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75          /* A bou
e290: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20  nd parameter in 
e2a0: 61 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  a CREATE stateme
e2b0: 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  nt that originat
e2c0: 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20  es from.        
e2d0: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
e2e0: 72 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65  re() causes an e
e2f0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
e300: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
e310: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
e320: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
e330: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
e340: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
e350: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
e360: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
e370: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
e380: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
e390: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
e3a0: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
e3b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
e3c0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
e3d0: 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  S ); /* selectNo
e3e0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
e3f0: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
e400: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
e410: 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73  ontinue;.  }.}.s
e420: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
e430: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
e440: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
e450: 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29  Select *NotUsed)
e460: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
e470: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
e480: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
e490: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
e4a0: 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69  C_Abort;.}.stati
e4b0: 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73  c int exprIsCons
e4c0: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
e4d0: 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75  nitFlag, int iCu
e4e0: 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
e4f0: 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
e500: 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
e510: 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67  eCode = initFlag
e520: 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
e530: 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73  ack = exprNodeIs
e540: 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53  Constant;.  w.xS
e550: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
e560: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
e570: 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72  tant;.  w.u.iCur
e580: 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74   = iCur;.  sqlit
e590: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
e5a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
e5b0: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ode;.}../*.** Wa
e5c0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
e5d0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
e5e0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
e5f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
e600: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
e610: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
e620: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
e630: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
e640: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
e650: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
e660: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
e670: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
e680: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
e690: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
e6a0: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
e6b0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
e6c0: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
e6d0: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
e6e0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
e6f0: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
e700: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
e710: 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29  IsConst(p, 1, 0)
e720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
e730: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
e740: 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
e750: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
e760: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
e770: 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20  nt.** that does 
e780: 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f  no originate fro
e790: 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
e7a0: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
e7b0: 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  oin..** Return 0
e7c0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
e7d0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
e7e0: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74  ction calls or t
e7f0: 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20  erms from.** an 
e800: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
e810: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
e820: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
e830: 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29  NotJoin(Expr *p)
e840: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
e850: 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b  sConst(p, 2, 0);
e860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
e870: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
e880: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
e890: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
e8a0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
e8b0: 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e  t.** for any sin
e8c0: 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74  gle row of the t
e8d0: 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
e8e0: 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72   iCur.  In other
e8f0: 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65   words, the.** e
e900: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e  xpression must n
e910: 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20  ot refer to any 
e920: 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
e930: 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61  c function nor a
e940: 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65  ny.** table othe
e950: 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a  r than iCur..*/.
e960: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
e970: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45  sTableConstant(E
e980: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72  xpr *p, int iCur
e990: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
e9a0: 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43  IsConst(p, 3, iC
e9b0: 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ur);.}../*.** Wa
e9c0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
e9d0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
e9e0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
e9f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
ea00: 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75  stant.** or a fu
ea10: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68  nction call with
ea20: 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
ea30: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64  nts.  Return and
ea40: 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61   0 if there.** a
ea50: 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73  re any variables
ea60: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
ea70: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
ea80: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
ea90: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
eaa0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
eab0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
eac0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
ead0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
eae0: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
eaf0: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
eb00: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
eb10: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
eb20: 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a  rFunction(Expr *
eb30: 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20  p, u8 isInit){. 
eb40: 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d   assert( isInit=
eb50: 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20  =0 || isInit==1 
eb60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  );.  return expr
eb70: 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49  IsConst(p, 4+isI
eb80: 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64  nit, 0);.}..#ifd
eb90: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
eba0: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a  _CURSOR_HINTS./*
ebb0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
ebc0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
ebd0: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
ebe0: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
ebf0: 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  s a.** subquery 
ec00: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52  of some kind.  R
ec10: 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65  eturn 0 if there
ec20: 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69   are no subqueri
ec30: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
ec40: 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75  e3ExprContainsSu
ec50: 62 71 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b  bquery(Expr *p){
ec60: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
ec70: 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
ec80: 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f  eof(w));.  w.eCo
ec90: 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
eca0: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
ecb0: 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
ecc0: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
ecd0: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
ece0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73  eIsConstant;.  s
ecf0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
ed00: 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
ed10: 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65  w.eCode==0;.}.#e
ed20: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
ed30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
ed40: 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  codes a constant
ed50: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73   integer that is
ed60: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a   small enough.**
ed70: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d   to fit in a 32-
ed80: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
ed90: 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68  urn 1 and put th
eda0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
edb0: 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56  nteger.** in *pV
edc0: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78  alue.  If the ex
edd0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
ede0: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66  an integer or if
edf0: 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a   it is too big.*
ee00: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69  * to fit in a si
ee10: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
ee20: 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e  ger, return 0 an
ee30: 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20  d leave *pValue 
ee40: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
ee50: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  t sqlite3ExprIsI
ee60: 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
ee70: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
ee80: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  int rc = 0;..  /
ee90: 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69  * If an expressi
eea0: 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
eeb0: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69   literal that fi
eec0: 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  ts in a signed 3
eed0: 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67  2-bit.  ** integ
eee0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f  er, then the EP_
eef0: 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69  IntValue flag wi
ef00: 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
ef10: 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73  been set */.  as
ef20: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
ef30: 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66  INTEGER || (p->f
ef40: 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
ef50: 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ue)!=0.         
ef60: 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
ef70: 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
ef80: 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20  , &rc)==0 );..  
ef90: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
efa0: 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
efb0: 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75    *pValue = p->u
efc0: 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74  .iValue;.    ret
efd0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69  urn 1;.  }.  swi
efe0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
eff0: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
f000: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
f010: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
f020: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
f030: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
f040: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f050: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
f060: 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
f070: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
f080: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
f090: 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
f0a0: 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28      assert( v!=(
f0b0: 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29  -2147483647-1) )
f0c0: 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  ;.        *pValu
f0d0: 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
f0e0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
f0f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f100: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
f110: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
f120: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f130: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
f140: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
f150: 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70  nce that the exp
f160: 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e  ression can be N
f170: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ULL..**.** If th
f180: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67  e expression mig
f190: 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66  ht be NULL or if
f1a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f1b0: 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a  is too complex.*
f1c0: 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e  * to tell return
f1d0: 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54   TRUE.  .**.** T
f1e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
f1f0: 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69  sed as an optimi
f200: 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20  zation, to skip 
f210: 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65  OP_IsNull opcode
f220: 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f  s.** when we kno
f230: 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63  w that a value c
f240: 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20  annot be NULL.  
f250: 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70  Hence, a false p
f260: 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75  ositive.** (retu
f270: 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20  rning TRUE when 
f280: 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72  in fact the expr
f290: 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72  ession can never
f2a0: 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a   be NULL) might.
f2b0: 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65  ** be a small pe
f2c0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75  rformance hit bu
f2d0: 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68  t is otherwise h
f2e0: 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65  armless.  On the
f2f0: 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20   other.** hand, 
f300: 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  a false negative
f310: 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53   (returning FALS
f320: 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  E when the resul
f330: 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29  t could be NULL)
f340: 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  .** will likely 
f350: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
f360: 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20  orrect answer.  
f370: 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74  So when in doubt
f380: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45  , return.** TRUE
f390: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f3a0: 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f  ExprCanBeNull(co
f3b0: 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  nst Expr *p){.  
f3c0: 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20  u8 op;.  while( 
f3d0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
f3e0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
f3f0: 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
f400: 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
f410: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
f420: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
f430: 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
f440: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
f450: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
f460: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
f470: 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  G:.    case TK_F
f480: 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LOAT:.    case T
f490: 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65  K_BLOB:.      re
f4a0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65  turn 0;.    case
f4b0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
f4c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61    assert( p->pTa
f4d0: 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65  b!=0 );.      re
f4e0: 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
f4f0: 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65  erty(p, EP_CanBe
f500: 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20  Null) ||.       
f510: 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d        (p->iColum
f520: 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d  n>=0 && p->pTab-
f530: 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e  >aCol[p->iColumn
f540: 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20  ].notNull==0);. 
f550: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
f560: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
f570: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f580: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
f590: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
f5a0: 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68  a constant which
f5b0: 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63   would be.** unc
f5c0: 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66  hanged by OP_Aff
f5d0: 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61  inity with the a
f5e0: 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e  ffinity given in
f5f0: 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   the second.** a
f600: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
f610: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
f620: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
f630: 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e   if the OP_Affin
f640: 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  ity operation.**
f650: 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e   can be omitted.
f660: 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20    When in doubt 
f670: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41  return FALSE.  A
f680: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a   false negative.
f690: 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20  ** is harmless. 
f6a0: 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   A false positiv
f6b0: 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20  e, however, can 
f6c0: 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72  result in the wr
f6d0: 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a  ong.** answer..*
f6e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
f6f0: 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
f700: 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70  Change(const Exp
f710: 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b  r *p, char aff){
f720: 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20  .  u8 op;.  if( 
f730: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
f740: 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b  BLOB ) return 1;
f750: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
f760: 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
f770: 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
f780: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
f790: 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
f7a0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
f7b0: 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
f7c0: 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
f7d0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
f7e0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
f7f0: 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
f800: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
f810: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
f820: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
f830: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
f840: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  OAT: {.      ret
f850: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
f860: 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d  AFF_REAL || aff=
f870: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
f880: 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
f890: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
f8a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
f8b0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f==SQLITE_AFF_TE
f8c0: 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  XT;.    }.    ca
f8d0: 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
f8e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
f8f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f900: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
f910: 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c  assert( p->iTabl
f920: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61  e>=0 );  /* p ca
f930: 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20  nnot be part of 
f940: 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  a CHECK constrai
f950: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  nt */.      retu
f960: 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a  rn p->iColumn<0.
f970: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66            && (af
f980: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
f990: 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
f9a0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
f9b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  );.    }.    def
f9c0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65  ault: {.      re
f9d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
f9e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
f9f0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
fa00: 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20  ven string is a 
fa10: 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61  row-id column na
fa20: 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  me..*/.int sqlit
fa30: 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20  e3IsRowid(const 
fa40: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20  char *z){.  if( 
fa50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
fa60: 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20  , "_ROWID_")==0 
fa70: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
fa80: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
fa90: 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20  (z, "ROWID")==0 
faa0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
fab0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
fac0: 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20  (z, "OID")==0 ) 
fad0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
fae0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn 0;.}../*.** p
faf0: 58 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20  X is the RHS of 
fb00: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20  an IN operator. 
fb10: 20 49 66 20 70 58 20 69 73 20 61 20 53 45 4c 45   If pX is a SELE
fb20: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  CT statement .**
fb30: 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d   that can be sim
fb40: 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69 72  plified to a dir
fb50: 65 63 74 20 74 61 62 6c 65 20 61 63 63 65 73 73  ect table access
fb60: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a  , then return.**
fb70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
fb80: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
fb90: 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f  nt.  If pX is no
fba0: 74 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  t a SELECT state
fbb0: 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74  ment,.** or if t
fbc0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
fbd0: 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ent needs to be 
fbe0: 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20  manifested into 
fbf0: 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74  a transient.** t
fc00: 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72  able, then retur
fc10: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64  n NULL..*/.#ifnd
fc20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
fc30: 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 53  UBQUERY.static S
fc40: 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61  elect *isCandida
fc50: 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20  teForInOpt(Expr 
fc60: 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  *pX){.  Select *
fc70: 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  p;.  SrcList *pS
fc80: 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc;.  ExprList *
fc90: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
fca0: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pTab;.  int i;.
fcb0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
fcc0: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
fcd0: 73 53 65 6c 65 63 74 29 20 29 20 72 65 74 75 72  sSelect) ) retur
fce0: 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73  n 0;  /* Not a s
fcf0: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28  ubquery */.  if(
fd00: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
fd10: 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  (pX, EP_VarSelec
fd20: 74 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20  t)  ) return 0; 
fd30: 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73   /* Correlated s
fd40: 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d  ubq */.  p = pX-
fd50: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66  >x.pSelect;.  if
fd60: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65  ( p->pPrior ) re
fd70: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
fd80: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f       /* Not a co
fd90: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
fda0: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
fdb0: 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
fdc0: 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20  t|SF_Aggregate) 
fdd0: 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
fde0: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
fdf0: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
fe00: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
fe10: 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
fe20: 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65  testcase( (p->se
fe30: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
fe40: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
fe50: 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
fe60: 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  te );.    return
fe70: 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e   0; /* No DISTIN
fe80: 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e  CT keyword and n
fe90: 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
fea0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61  tions */.  }.  a
feb0: 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
fec0: 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  By==0 );        
fed0: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
fee0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
fef0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  */.  if( p->pLim
ff00: 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
ff20: 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75  as no LIMIT clau
ff30: 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
ff40: 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ff60: 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73  * No LIMIT means
ff70: 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20   no OFFSET */.  
ff80: 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20  if( p->pWhere ) 
ff90: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
ffa0: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
ffb0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
ffc0: 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
ffd0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
ffe0: 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53  c!=0 );.  if( pS
fff0: 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
10000 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
10010 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20   /* Single term 
10020 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
10030 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b  /.  if( pSrc->a[
10040 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74  0].pSelect ) ret
10050 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52  urn 0;     /* FR
10060 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71  OM is not a subq
10070 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a  uery or view */.
10080 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
10090 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65  [0].pTab;.  asse
100a0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
100b0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
100c0 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20  Select==0 );    
100d0 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
100e0 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
100f0 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73  view */.  if( Is
10100 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
10110 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
10120 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
10130 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
10140 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ble */.  pEList 
10150 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61  = p->pEList;.  a
10160 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
10170 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c   );.  /* All SEL
10180 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74  ECT results must
10190 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a   be columns. */.
101a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
101b0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
101c0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73  {.    Expr *pRes
101d0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
101e0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
101f0 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  Res->op!=TK_COLU
10200 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
10210 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
10220 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61  >iTable==pSrc->a
10230 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20  [0].iCursor );  
10240 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
10250 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
10260 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
10270 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10280 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
10290 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
102a0 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72  an OP_Once instr
102b0 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63  uction and alloc
102c0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ate space for it
102d0 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20 74  s flag. Return t
102e0 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  he .** address o
102f0 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
10300 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
10310 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50 61  lite3CodeOnce(Pa
10320 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
10330 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
10340 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
10350 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  ;      /* Virtua
10360 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
10370 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75 72  coded */.  retur
10380 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
10390 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20  Op1(v, OP_Once, 
103a0 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29  pParse->nOnce++)
103b0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
103c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
103d0 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
103e0 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b   code that check
103f0 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
10400 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
10410 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65  table iCur to se
10420 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61  e if.** it conta
10430 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74  ins any NULL ent
10440 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65  ries.  Cause the
10450 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67   register at reg
10460 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65  HasNull to be se
10470 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  t.** to a non-NU
10480 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72  LL value if iCur
10490 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
104a0 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73  Ls.  Cause regis
104b0 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a  ter regHasNull.*
104c0 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e  * to be set to N
104d0 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74  ULL if iCur cont
104e0 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
104f0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f   NULL values..*/
10500 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
10510 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
10520 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ag(Vdbe *v, int 
10530 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73  iCur, int regHas
10540 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64  Null){.  int add
10550 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r1;.  sqlite3Vdb
10560 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
10570 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73  teger, 0, regHas
10580 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d  Null);.  addr1 =
10590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
105a0 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
105b0 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65   iCur); VdbeCove
105c0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
105d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
105e0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c  OP_Column, iCur,
105f0 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b   0, regHasNull);
10600 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
10610 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
10620 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56  _TYPEOFARG);.  V
10630 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
10640 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25  first_entry_in(%
10650 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73  d)", iCur));.  s
10660 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10670 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a  re(v, addr1);.}.
10680 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66  #endif...#ifndef
10690 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
106a0 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20  QUERY./*.** The 
106b0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49  argument is an I
106c0 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
106d0 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
106e0 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a  bquery) on the .
106f0 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
10700 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
10710 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73   if that list is
10720 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74   constant..*/.st
10730 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
10740 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
10750 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78  Expr *pIn){.  Ex
10760 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20  pr *pLHS;.  int 
10770 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21  res;.  assert( !
10780 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
10790 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  pIn, EP_xIsSelec
107a0 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70  t) );.  pLHS = p
107b0 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e  In->pLeft;.  pIn
107c0 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72  ->pLeft = 0;.  r
107d0 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  es = sqlite3Expr
107e0 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b  IsConstant(pIn);
107f0 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
10800 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72  pLHS;.  return r
10810 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  es;.}.#endif../*
10820 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
10830 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
10840 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
10850 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
10860 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65  operator..** The
10870 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73   pX parameter is
10880 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10890 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
108a0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  e IN operator, w
108b0 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
108c0 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f   either a list o
108d0 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72  f expressions or
108e0 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a   a subquery..**.
108f0 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
10900 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
10910 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
10920 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  a b-tree object 
10930 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75  that can.** be u
10940 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65  sed either to te
10950 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
10960 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74  p in the RHS set
10970 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
10980 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65  hrough.** all me
10990 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53  mbers of the RHS
109a0 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64   set, skipping d
109b0 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  uplicates..**.**
109c0 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65   A cursor is ope
109d0 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65  ned on the b-tre
109e0 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  e object that is
109f0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
10a00 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61  IN operator.** a
10a10 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73  nd pX->iTable is
10a20 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
10a30 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72  x of that cursor
10a40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
10a50 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  rned value of th
10a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
10a70 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65  cates the b-tree
10a80 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77   type, as follow
10a90 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e  s:.**.**   IN_IN
10aa0 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d  DEX_ROWID      -
10ab0 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
10ac0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
10ad0 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  base table..**  
10ae0 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
10af0 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f  ASC  - The curso
10b00 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
10b10 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
10b20 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
10b30 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54  X_INDEX_DESC - T
10b40 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
10b50 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e  ened on a descen
10b60 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
10b70 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20   IN_INDEX_EPH   
10b80 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
10b90 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
10ba0 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
10bb0 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68     populated eph
10be0 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  eremal table..**
10bf0 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50     IN_INDEX_NOOP
10c00 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73         - No curs
10c10 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  or was allocated
10c20 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  .  The IN operat
10c30 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20  or must be.**   
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c50 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65        implemente
10c60 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20  d as a sequence 
10c70 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
10c80 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
10c90 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62  g b-tree might b
10ca0 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48  e used if the RH
10cb0 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20  S expression pX 
10cc0 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73  is a simple.** s
10cd0 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a  ubquery such as:
10ce0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
10cf0 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f  T <column1>, <co
10d00 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c  lumn2>... FROM <
10d10 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20  table>.**.** If 
10d20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
10d30 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
10d40 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63  list or a more c
10d50 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c  omplex subquery,
10d60 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65   then.** an ephe
10d70 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68  meral table migh
10d80 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e  t need to be gen
10d90 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
10da0 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20  RHS and then.** 
10db0 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20  pX->iTable made 
10dc0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
10dd0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
10de0 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a  instead of an.**
10df0 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e   existing table.
10e00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61  .**.** The inFla
10e10 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73  gs parameter mus
10e20 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74 6c  t contain exactl
10e30 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74  y one of the bit
10e40 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  s.** IN_INDEX_ME
10e50 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49  MBERSHIP or IN_I
10e60 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20 69  NDEX_LOOP.  If i
10e70 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a  nFlags contains.
10e80 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  ** IN_INDEX_MEMB
10e90 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65  ERSHIP, then the
10ea0 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
10eb0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
10ec0 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d 62  r a.** fast memb
10ed0 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68  ership test.  Wh
10ee0 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  en the IN_INDEX_
10ef0 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c  LOOP bit is set,
10f00 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65 78   the.** IN index
10f10 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
10f20 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76   loop over all v
10f30 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53  alues of the RHS
10f40 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f 70   of the.** IN op
10f50 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  erator..**.** Wh
10f60 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  en IN_INDEX_LOOP
10f70 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
10f80 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
10f90 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
10fa0 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20  .** through the 
10fb0 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65  set members) the
10fc0 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73  n the b-tree mus
10fd0 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75  t not contain du
10fe0 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20  plicates..** An 
10ff0 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
11000 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c  must be used unl
11010 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
11020 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61   columns are gua
11030 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
11040 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
11050 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
11060 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
11070 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a  Y KEY or due to.
11080 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73  ** a UNIQUE cons
11090 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e  traint or index.
110a0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
110b0 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
110c0 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
110d0 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
110e0 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
110f0 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
11100 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20   tests) then an 
11110 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
11120 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
11130 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73   unless <columns
11140 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e  > is a single IN
11150 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
11160 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a  Y column or an .
11170 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  ** index can be 
11180 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73  found with the s
11190 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e  pecified <column
111a0 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  s> as its left-m
111b0 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ost..**.** If th
111c0 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  e IN_INDEX_NOOP_
111d0 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  OK and IN_INDEX_
111e0 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62  MEMBERSHIP are b
111f0 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69  oth set and.** i
11200 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
11210 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
11220 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
11230 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69  bquery) then thi
11240 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67  s.** routine mig
11250 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63  ht decide that c
11260 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
11270 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20  eral b-tree for 
11280 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65  membership.** te
11290 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70  sting is too exp
112a0 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72  ensive and retur
112b0 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
112c0 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
112d0 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  the.** calling r
112e0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d  outine should im
112f0 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f  plement the IN o
11300 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20  perator using a 
11310 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45  sequence.** of E
11320 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73  q or Ne comparis
11330 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  on operations..*
11340 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d  *.** When the b-
11350 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73  tree is being us
11360 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ed for membershi
11370 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c  p tests, the cal
11380 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
11390 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b   might need to k
113a0 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
113b0 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20  ot the RHS side 
113c0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
113d0 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  or.** contains a
113e0 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73   NULL.  If prRhs
113f0 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61  HasNull is not a
11400 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e   NULL pointer an
11410 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  d .** if there i
11420 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61  s any chance tha
11430 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68  t the (...) migh
11440 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
11450 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
11460 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
11470 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
11480 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
11490 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
114a0 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48  en.** to *prRhsH
114b0 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65  asNull. If there
114c0 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
114d0 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e  at the (...) con
114e0 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
114f0 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52  value, then *prR
11500 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66  hsHasNull is lef
11510 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
11520 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
11530 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
11540 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73  d its location s
11550 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48  tored in *prRhsH
11560 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20  asNull, then.** 
11570 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61  the value in tha
11580 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20  t register will 
11590 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62  be NULL if the b
115a0 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f  -tree contains o
115b0 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55  ne or more.** NU
115c0 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69  LL values, and i
115d0 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e  t will be some n
115e0 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
115f0 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74   the b-tree cont
11600 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20  ains no.** NULL 
11610 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  values..**.** If
11620 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d   the aiMap param
11630 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  eter is not NULL
11640 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  , it must point 
11650 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74  to an array cont
11660 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c  aining.** one el
11670 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63  ement for each c
11680 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62  olumn returned b
11690 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
116a0 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48  tement on the RH
116b0 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e  S.** of the IN(.
116c0 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68  ..) operator. Th
116d0 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20  e i'th entry of 
116e0 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70  the array is pop
116f0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ulated with the.
11700 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  ** offset of the
11710 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
11720 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
11730 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72  'th column retur
11740 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45  ned by the.** SE
11750 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c  LECT. For exampl
11760 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73  e, if the expres
11770 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65  sion and selecte
11780 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a  d index are:.**.
11790 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20  **   (?,?,?) IN 
117a0 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20  (SELECT a, b, c 
117b0 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52  FROM t1).**   CR
117c0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
117d0 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a   t1(b, c, a);.**
117e0 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d  .** then aiMap[]
117f0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
11800 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f  th {2, 0, 1}..*/
11810 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11820 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
11830 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  t sqlite3FindInI
11840 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
11850 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
11860 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
11870 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
11880 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pX,            
11890 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
118a0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
118b0 53 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  S) of the IN ope
118c0 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69  rator */.  u32 i
118d0 6e 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  nFlags,         
118e0 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45        /* IN_INDE
118f0 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53  X_LOOP, _MEMBERS
11900 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f  HIP, and/or _NOO
11910 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  P_OK */.  int *p
11920 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20  rRhsHasNull,    
11930 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
11940 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74   holding NULL st
11950 61 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73  atus.  See notes
11960 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
11990 20 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f   Index fields to
119a0 20 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29   RHS fields */.)
119b0 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
119e0 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
119f0 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
11a00 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
11a10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
11a30 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
11a40 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
11a50 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
11a60 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
11a70 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
11a80 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
11a90 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
11aa0 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20  eUnique;        
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ac0 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
11ad0 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
11ae0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
11af0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
11b00 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
11b10 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
11b20 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
11b30 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
11b40 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71   );.  mustBeUniq
11b50 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20  ue = (inFlags & 
11b60 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d  IN_INDEX_LOOP)!=
11b70 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
11b80 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e  RHS of this IN(.
11b90 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ..) operator is 
11ba0 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66  a SELECT, and if
11bb0 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a   it matters .  *
11bc0 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
11bd0 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75   the SELECT resu
11be0 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  lt contains NULL
11bf0 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77   values, check w
11c00 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
11c10 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61  ot NULL is actua
11c20 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74  lly possible (it
11c30 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72   may not be, for
11c40 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20   example, due . 
11c50 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20   ** to NOT NULL 
11c60 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
11c70 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e  he schema). If n
11c80 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
11c90 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a  e possible,.  **
11ca0 20 73 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c   set prRhsHasNul
11cb0 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f  l to 0 before co
11cc0 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20  ntinuing.  */.  
11cd0 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
11ce0 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20 26   && (pX->flags &
11cf0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
11d00 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
11d10 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
11d20 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  t = pX->x.pSelec
11d30 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66  t->pEList;.    f
11d40 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
11d50 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
11d60 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
11d70 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45  ExprCanBeNull(pE
11d80 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
11d90 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
11da0 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69  .    if( i==pELi
11db0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
11dc0 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20     prRhsHasNull 
11dd0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
11de0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
11df0 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
11e00 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
11e10 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
11e20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
11e30 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
11e40 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
11e50 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
11e60 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
11e70 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  able.  */.  if( 
11e80 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
11e90 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64  && (p = isCandid
11ea0 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29  ateForInOpt(pX))
11eb0 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
11ec0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11ed0 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
11ee0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
11ef0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nnection */.    
11f00 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
11f30 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
11f40 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20  i16 iDb;        
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
11f70 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20  se idx for pTab 
11f80 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
11f90 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  *pEList = p->pEL
11fa0 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78  ist;.    int nEx
11fb0 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
11fc0 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  pr;..    assert(
11fd0 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ff0 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
12000 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
12010 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
12020 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
12030 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20  .pExpr!=0 ); /* 
12040 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
12050 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
12060 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
12070 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20   p->pSrc!=0 );  
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12090 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
120a0 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
120b0 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  ) */.    pTab = 
120c0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
120d0 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65  ab;..    /* Code
120e0 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69   an OP_Transacti
120f0 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c  on and OP_TableL
12100 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e  ock for <table>.
12110 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
12120 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
12130 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
12140 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  hema);.    sqlit
12150 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
12160 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
12170 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
12180 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
12190 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
121a0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
121b0 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 20  .    assert(v); 
121c0 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64   /* sqlite3GetVd
121d0 62 65 28 29 20 68 61 73 20 61 6c 77 61 79 73 20  be() has always 
121e0 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
121f0 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66  called */.    if
12200 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45  ( nExpr==1 && pE
12210 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
12220 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
12230 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49       /* The "x I
12240 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20  N (SELECT rowid 
12250 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73  FROM table)" cas
12260 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  e */.      int i
12270 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
12280 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
12290 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
122a0 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71  ge(v);..      sq
122b0 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
122c0 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
122d0 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
122e0 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70  ead);.      eTyp
122f0 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
12300 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ID;..      sqlit
12310 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12320 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65  , iAddr);.    }e
12330 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
12340 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
12370 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
12380 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
12390 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  1;.      int i;.
123a0 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
123b0 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
123c0 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
123d0 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65  sed to perform e
123e0 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ach .      ** co
123f0 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20  mparison is the 
12400 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69  same as the affi
12410 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c  nity of each col
12420 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20  umn in table.   
12430 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53     ** on the RHS
12440 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
12450 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c  tor.  If it not,
12460 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
12470 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
12480 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66  use any index of
12490 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20   the RHS table. 
124a0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
124b0 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66  0; i<nExpr && af
124c0 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b  finity_ok; i++){
124d0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
124e0 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63  Lhs = sqlite3Vec
124f0 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
12500 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pX->pLeft, i);. 
12510 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
12520 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
12530 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
12540 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61         char idxa
12550 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c  ff = sqlite3Tabl
12560 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  eColumnAffinity(
12570 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52  pTab,iCol); /* R
12580 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  HS table */.    
12590 20 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20      char cmpaff 
125a0 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
125b0 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69  Affinity(pLhs, i
125c0 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  dxaff);.        
125d0 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66  testcase( cmpaff
125e0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
125f0 42 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  B );.        tes
12600 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53  tcase( cmpaff==S
12610 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
12620 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  ;.        switch
12630 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20  ( cmpaff ){.    
12640 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
12650 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20  E_AFF_BLOB:.    
12660 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12670 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
12680 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20  LITE_AFF_TEXT:. 
12690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
126a0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
126b0 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75  nity() only retu
126c0 72 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20  rns TEXT if one 
126d0 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20  side or the.    
126e0 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
126f0 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79   has no affinity
12700 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73   and the other s
12710 69 64 65 20 69 73 20 54 45 58 54 2e 20 20 48 65  ide is TEXT.  He
12720 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nce,.           
12730 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   ** the only way
12740 20 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62   for cmpaff to b
12750 65 20 54 45 58 54 20 69 73 20 66 6f 72 20 69 64  e TEXT is for id
12760 78 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a  xaff to be TEXT.
12770 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
12780 6e 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20  nd for the term 
12790 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
127a0 65 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20  e IN to have no 
127b0 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
127c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
127d0 20 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f   idxaff==SQLITE_
127e0 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
127f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12800 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
12810 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66  :.            af
12820 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69  finity_ok = sqli
12830 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
12840 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20  nity(idxaff);.  
12850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12860 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 69 6e  .      if( affin
12870 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20  ity_ok ){.      
12880 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
12890 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65  an existing inde
128a0 78 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b  x that will work
128b0 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65   for this IN ope
128c0 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
128d0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
128e0 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20  pIndex; pIdx && 
128f0 65 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70  eType==0; pIdx=p
12900 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
12910 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63         Bitmask c
12920 6f 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20  olUsed;      /* 
12930 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  Columns of the i
12940 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20 20  ndex used */.   
12950 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
12960 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Col;         /* 
12970 4d 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75 72  Mask for the cur
12980 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  rent column */. 
12990 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
129a0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72  x->nColumn<nExpr
129b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
129c0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
129d0 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53  m nColumn is BMS
129e0 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73  -2, not BMS-1, s
129f0 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 6f  o that we can co
12a00 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20 20 20  mpute.          
12a10 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70 72  ** BITMASK(nExpr
12a20 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66 6c  ) without overfl
12a30 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  owing */.       
12a40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64     testcase( pId
12a50 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d  x->nColumn==BMS-
12a60 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  2 );.          t
12a70 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e  estcase( pIdx->n
12a80 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b  Column==BMS-1 );
12a90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
12aa0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d  Idx->nColumn>=BM
12ab0 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  S-1 ) continue;.
12ac0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 75            if( mu
12ad0 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20 20  stBeUnique ){.  
12ae0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
12af0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70  dx->nKeyCol>nExp
12b00 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  r.             |
12b10 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  |(pIdx->nColumn>
12b20 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e 69 71  nExpr && !IsUniq
12b30 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a 20  ueIndex(pIdx)). 
12b40 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
12b50 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
12b60 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 69  inue;  /* This i
12b70 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69 71  ndex is not uniq
12b80 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20 52  ue over the IN R
12b90 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  HS columns */.  
12ba0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12bb0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
12bc0 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20 30       colUsed = 0
12bd0 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f  ;   /* Columns o
12be0 66 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f 20  f index used so 
12bf0 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  far */.         
12c00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
12c10 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
12c20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
12c30 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
12c40 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
12c50 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
12c60 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 68         Expr *pRh
12c70 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s = pEList->a[i]
12c80 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
12c90 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65      CollSeq *pRe
12ca0 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  q = sqlite3Binar
12cb0 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
12cc0 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52  pParse, pLhs, pR
12cd0 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  hs);.           
12ce0 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20   int j;.  .     
12cf0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12d00 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e  Req!=0 || pRhs->
12d10 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49  iColumn==XN_ROWI
12d20 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  D || pParse->nEr
12d30 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
12d40 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70   for(j=0; j<nExp
12d50 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
12d60 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
12d70 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52  >aiColumn[j]!=pR
12d80 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  hs->iColumn ) co
12d90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
12db0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b  dx->azColl[j] );
12dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
12dd0 66 28 20 70 52 65 71 21 3d 30 20 26 26 20 73 71  f( pReq!=0 && sq
12de0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65  lite3StrICmp(pRe
12df0 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e  q->zName, pIdx->
12e00 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b  azColl[j])!=0 ){
12e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12e20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12e30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12e40 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
12e50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
12e60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
12e70 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a  =nExpr ) break;.
12e80 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c              mCol
12e90 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20   = MASKBIT(j);. 
12ea0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d             if( m
12eb0 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29 20  Col & colUsed ) 
12ec0 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63  break; /* Each c
12ed0 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20  olumn used only 
12ee0 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  once */.        
12ef0 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d      colUsed |= m
12f00 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
12f10 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d   if( aiMap ) aiM
12f20 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20  ap[i] = j;.     
12f30 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
12f40 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
12f50 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21  Expr || colUsed!
12f60 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29  =(MASKBIT(nExpr)
12f70 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  -1) );.         
12f80 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d   if( colUsed==(M
12f90 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
12fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12fb0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
12fc0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
12fd0 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78 20  means the index 
12fe0 70 49 64 78 20 69 73 20 75 73 61 62 6c 65 20 2a  pIdx is usable *
12ff0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
13000 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
13010 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
13020 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
13030 76 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  v);.#ifndef SQLI
13040 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
13050 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13060 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13070 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30 2c 20   OP_Explain, 0, 
13080 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
13090 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
130a0 74 66 28 64 62 2c 20 22 55 53 49 4e 47 20 49 4e  tf(db, "USING IN
130b0 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50  DEX %s FOR IN-OP
130c0 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e  ERATOR",pIdx->zN
130d0 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
130e0 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b      P4_DYNAMIC);
130f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
13100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13110 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
13120 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78  Read, iTab, pIdx
13130 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
13140 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13150 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
13160 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
13170 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
13180 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
13190 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
131a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
131b0 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49  sert( IN_INDEX_I
131c0 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f  NDEX_DESC == IN_
131d0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b  INDEX_INDEX_ASC+
131e0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
131f0 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
13200 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49  X_INDEX_ASC + pI
13210 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  dx->aSortOrder[0
13220 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  ];.  .          
13230 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75    if( prRhsHasNu
13240 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ll ){.#ifdef SQL
13250 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
13260 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20  N_USED_MASK.    
13270 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61            i64 ma
13280 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d  sk = (1<<nExpr)-
13290 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
132a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
132b0 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
132c0 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20  umnsUsed, .     
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
132e0 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d  b, 0, 0, (u8*)&m
132f0 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  ask, P4_INT64);.
13300 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
13310 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75       *prRhsHasNu
13320 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
13330 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
13340 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20     if( nExpr==1 
13350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
13360 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73     sqlite3SetHas
13370 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62  NullFlag(v, iTab
13380 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29  , *prRhsHasNull)
13390 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
133a0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
133b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
133c0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
133d0 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  v, iAddr);.     
133e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
133f0 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* End loop ove
13400 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20  r indexes */.   
13410 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20     } /* End if( 
13420 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f  affinity_ok ) */
13430 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66  .    } /* End if
13440 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e   not an rowid in
13450 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e  dex */.  } /* En
13460 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74  d attempt to opt
13470 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69  imize using an i
13480 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  ndex */..  /* If
13490 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20   no preexisting 
134a0 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62  index is availab
134b0 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c  le for the IN cl
134c0 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  ause.  ** and IN
134d0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61  _INDEX_NOOP is a
134e0 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a  n allowed reply.
134f0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53    ** and the RHS
13500 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
13510 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e  tor is a list, n
13520 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20  ot a subquery.  
13530 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69  ** and the RHS i
13540 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f  s not constant o
13550 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77  r has two or few
13560 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74  er terms,.  ** t
13570 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f  hen it is not wo
13580 72 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20  rth creating an 
13590 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
135a0 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a  to evaluate.  **
135b0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
135c0 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e   so return IN_IN
135d0 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20  DEX_NOOP..  */. 
135e0 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20   if( eType==0.  
135f0 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49   && (inFlags & I
13600 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29  N_INDEX_NOOP_OK)
13610 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50  .   && !ExprHasP
13620 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
13630 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20  IsSelect).   && 
13640 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  (!sqlite3InRhsIs
13650 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20  Constant(pX) || 
13660 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pX->x.pList->nEx
13670 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20  pr<=2).  ){.    
13680 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
13690 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
136a0 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
136b0 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66    /* Could not f
136c0 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ind an existing 
136d0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
136e0 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53  o use as the RHS
136f0 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20   b-tree..    ** 
13700 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  We will have to 
13710 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65  generate an ephe
13720 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64  meral table to d
13730 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a  o the job..    *
13740 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e  /.    u32 savedN
13750 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
13760 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
13770 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65      int rMayHave
13780 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54  Null = 0;.    eT
13790 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45  ype = IN_INDEX_E
137a0 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c  PH;.    if( inFl
137b0 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c  ags & IN_INDEX_L
137c0 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OOP ){.      pPa
137d0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
137e0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
137f0 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  X->pLeft->iColum
13800 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50  n<0 && !ExprHasP
13810 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
13820 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
13830 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
13840 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20  INDEX_ROWID;.   
13850 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
13860 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
13870 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48  ){.      *prRhsH
13880 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76  asNull = rMayHav
13890 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  eNull = ++pParse
138a0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  ->nMem;.    }.  
138b0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
138c0 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
138d0 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  X, rMayHaveNull,
138e0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
138f0 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61  _ROWID);.    pPa
13900 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
13910 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  = savedNQueryLoo
13920 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  p;.  }else{.    
13930 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pX->iTable = iTa
13940 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69  b;.  }..  if( ai
13950 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e  Map && eType!=IN
13960 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
13970 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e   && eType!=IN_IN
13980 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29  DEX_INDEX_DESC )
13990 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  {.    int i, n;.
139a0 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45      n = sqlite3E
139b0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58  xprVectorSize(pX
139c0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f  ->pLeft);.    fo
139d0 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
139e0 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20   aiMap[i] = i;. 
139f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70   }.  return eTyp
13a00 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  e;.}.#endif..#if
13a10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13a20 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
13a30 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69  Argument pExpr i
13a40 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49  s an (?, ?...) I
13a50 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  N(...) expressio
13a60 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  n. This .** func
13a70 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
13a80 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  nd returns a nul
13a90 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
13aa0 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a  ng containing .*
13ab0 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73  * the affinities
13ac0 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
13ad0 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  each column of t
13ae0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a  he comparison..*
13af0 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  *.** It is the r
13b00 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
13b10 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
13b20 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72  nsure that the r
13b30 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e  eturned.** strin
13b40 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20  g is eventually 
13b50 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69  freed using sqli
13b60 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a  te3DbFree()..*/.
13b70 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70  static char *exp
13b80 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73  rINAffinity(Pars
13b90 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
13ba0 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20  *pExpr){.  Expr 
13bb0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
13bc0 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61  pLeft;.  int nVa
13bd0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  l = sqlite3ExprV
13be0 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29  ectorSize(pLeft)
13bf0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  ;.  Select *pSel
13c00 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c  ect = (pExpr->fl
13c10 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
13c20 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ct) ? pExpr->x.p
13c30 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68  Select : 0;.  ch
13c40 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73  ar *zRet;..  ass
13c50 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
13c60 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20  TK_IN );.  zRet 
13c70 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
13c80 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
13c90 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28  , nVal+1);.  if(
13ca0 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   zRet ){.    int
13cb0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
13cc0 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
13cd0 20 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20       Expr *pA = 
13ce0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
13cf0 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
13d00 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20   i);.      char 
13d10 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  a = sqlite3ExprA
13d20 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20  ffinity(pA);.   
13d30 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
13d40 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69  {.        zRet[i
13d50 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  ] = sqlite3Compa
13d60 72 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65  reAffinity(pSele
13d70 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ct->pEList->a[i]
13d80 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20  .pExpr, a);.    
13d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13da0 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20   zRet[i] = a;.  
13db0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13dc0 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30  zRet[nVal] = '\0
13dd0 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ';.  }.  return 
13de0 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
13df0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13e00 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
13e10 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73  ** Load the Pars
13e20 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
13e30 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
13e40 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72  ument with an er
13e50 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20  ror .** message 
13e60 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
13e70 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74  **   "sub-select
13e80 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d   returns N colum
13e90 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22  ns - expected M"
13ea0 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69  .*/   .void sqli
13eb0 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
13ec0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
13ed0 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e   int nActual, in
13ee0 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f  t nExpect){.  co
13ef0 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d  nst char *zFmt =
13f00 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74   "sub-select ret
13f10 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20  urns %d columns 
13f20 2d 20 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a  - expected %d";.
13f30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13f40 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20  g(pParse, zFmt, 
13f50 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74  nActual, nExpect
13f60 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
13f70 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
13f80 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71   for scalar subq
13f90 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61  ueries used as a
13fa0 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73   subquery expres
13fb0 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a  sion, EXISTS,.**
13fc0 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   or IN operators
13fd0 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  .  Examples:.**.
13fe0 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61  **     (SELECT a
13ff0 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20   FROM b)        
14000 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a    -- subquery.**
14010 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c       EXISTS (SEL
14020 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
14030 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65  -- EXISTS subque
14040 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  ry.**     x IN (
14050 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20  4,5,11)         
14060 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
14070 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e  tor with list on
14080 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
14090 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45  .**     x IN (SE
140a0 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
140b0 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
140c0 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20  r with subquery 
140d0 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a  on the right.**.
140e0 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72  ** The pExpr par
140f0 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73  ameter describes
14100 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
14110 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
14120 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  e IN.** operator
14130 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a   or subquery..**
14140 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
14150 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d   isRowid is non-
14160 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65  zero, then expre
14170 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67  ssion pExpr is g
14180 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
14190 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  be of the form "
141a0 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f  <rowid> IN (?, ?
141b0 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f  , ?)", where <ro
141c0 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65  wid> is a refere
141d0 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69  nce.** to some i
141e0 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d  nteger key colum
141f0 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54  n of a table B-T
14200 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
14210 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74  e, use an.** int
14220 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74  key B-Tree to st
14230 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49  ore the set of I
14240 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e  N(...) values in
14250 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
14260 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76  al.** (slower) v
14270 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
14280 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a  eys B-Tree..**.*
14290 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c  * If rMayHaveNul
142a0 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  l is non-zero, t
142b0 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
142c0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
142d0 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20  an IN.** (not a 
142e0 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
142f0 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 52  ) and that the R
14300 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  HS might contain
14310 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20  s NULLs..** All 
14320 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  this routine doe
14330 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20  s is initialize 
14340 74 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76  the register giv
14350 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75  en by rMayHaveNu
14360 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20  ll.** to NULL.  
14370 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73  Calling routines
14380 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20   will take care 
14390 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73  of changing this
143a0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c   register.** val
143b0 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  ue to non-NULL i
143c0 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c  f the RHS is NUL
143d0 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  L-free..**.** Fo
143e0 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  r a SELECT or EX
143f0 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72  ISTS operator, r
14400 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
14410 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  er that holds th
14420 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f  e.** result.  Fo
14430 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e  r a multi-column
14440 20 53 45 4c 45 43 54 2c 20 74 68 65 20 72 65 73   SELECT, the res
14450 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ult is stored in
14460 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a   a contiguous.**
14470 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
14480 65 72 73 20 61 6e 64 20 74 68 65 20 72 65 74 75  ers and the retu
14490 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
144a0 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 20  register of the 
144b0 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73  left-most.** res
144c0 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 52 65 74  ult column.  Ret
144d0 75 72 6e 20 30 20 66 6f 72 20 49 4e 20 6f 70 65  urn 0 for IN ope
144e0 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20  rators or if an 
144f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
14500 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14510 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
14520 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  t sqlite3CodeSub
14530 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  select(.  Parse 
14540 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14550 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
14560 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
14570 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
14580 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c    /* The IN, SEL
14590 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f  ECT, or EXISTS o
145a0 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
145b0 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20   rHasNullFlag,  
145c0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
145d0 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68   that records wh
145e0 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73  ether NULLs exis
145f0 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e  t in RHS */.  in
14600 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20  t isRowid       
14610 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
14620 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72  , LHS of IN oper
14630 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20  ator is a rowid 
14640 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49  */.){.  int jmpI
14650 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20  fDynamic = -1;  
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20      /* One-time 
14680 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a  test address */.
14690 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20    int rReg = 0; 
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
146c0 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65  ister storing re
146d0 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62  sulting */.  Vdb
146e0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
146f0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
14700 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
14710 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
14720 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
14730 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ush(pParse);..  
14740 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f  /* The evaluatio
14750 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45 58 49 53  n of the IN/EXIS
14760 54 53 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  TS/SELECT must b
14770 65 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79  e repeated every
14780 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73   time it.  ** is
14790 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20   encountered if 
147a0 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
147b0 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
147c0 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
147d0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
147e0 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
147f0 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
14800 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
14810 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
14820 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
14830 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
14840 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
14850 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
14860 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
14870 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
14880 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
14890 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
148a0 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
148b0 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
148c0 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
148d0 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
148e0 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
148f0 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
14900 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
14910 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
14920 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
14930 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79  ) ){.    jmpIfDy
14940 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 43  namic = sqlite3C
14950 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
14960 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14970 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
14980 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
14990 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  IN.  if( pParse-
149a0 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
149b0 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
149c0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
149d0 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43  Parse->db, "EXEC
149e0 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52  UTE %s%s SUBQUER
149f0 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 6a  Y %d",.        j
14a00 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22  mpIfDynamic>=0?"
14a10 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c  ":"CORRELATED ",
14a20 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
14a30 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22  op==TK_IN?"LIST"
14a40 3a 22 53 43 41 4c 41 52 22 2c 0a 20 20 20 20 20  :"SCALAR",.     
14a50 20 20 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74     pParse->iNext
14a60 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a  SelectId.    );.
14a70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14a80 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
14a90 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
14aa0 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
14ab0 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
14ac0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
14ad0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
14ae0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
14af0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
14b00 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
14b10 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
14b20 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
14b30 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
14b40 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
14b50 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
14b60 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c  >pLeft; /* the L
14b70 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
14b80 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b  rator */.      K
14b90 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
14ba0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65   = 0;      /* Ke
14bb0 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  y information */
14bc0 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b  .      int nVal;
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65     /* Size of ve
14bf0 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20  ctor pLeft */.  
14c00 20 20 20 20 0a 20 20 20 20 20 20 6e 56 61 6c 20      .      nVal 
14c10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
14c20 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
14c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69        assert( !i
14c40 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d  sRowid || nVal==
14c50 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  1 );..      /* W
14c60 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
14c70 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
14c80 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
14c90 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
14ca0 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
14cb0 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
14cc0 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e  he same way.  An
14cd0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
14ce0 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69   is .      ** fi
14cf0 6c 6c 65 64 20 77 69 74 68 20 69 6e 64 65 78 20  lled with index 
14d00 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e  keys representin
14d10 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  g the results fr
14d20 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  om the .      **
14d30 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c   SELECT or the <
14d40 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20  exprlist>..     
14d50 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
14d60 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69  the 'x' expressi
14d70 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
14d80 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c  alue, or the SEL
14d90 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  ECT....      ** 
14da0 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
14db0 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
14dc0 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
14dd0 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20  ity of that.    
14de0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75    ** column is u
14df0 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
14e00 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
14e10 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
14e20 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
14e30 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
14e40 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
14e50 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
14e60 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a   is used.      *
14e70 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75  * if either colu
14e80 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f  mn has NUMERIC o
14e90 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69  r INTEGER affini
14ea0 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20  ty. If neither. 
14eb0 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20       ** 'x' nor 
14ec0 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  the SELECT... st
14ed0 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
14ee0 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
14ef0 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20  c affinity.     
14f00 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20   ** is used..   
14f10 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
14f20 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
14f30 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
14f40 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
14f50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14f60 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
14f70 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
14f80 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73 52 6f 77  ->iTable, (isRow
14f90 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20  id?0:nVal));.   
14fa0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73     pKeyInfo = is
14fb0 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69  Rowid ? 0 : sqli
14fc0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
14fd0 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c  pParse->db, nVal
14fe0 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 1);..      if(
14ff0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
15000 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
15010 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
15020 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
15030 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
15040 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
15050 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
15060 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
15070 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
15080 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
15090 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
150a0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
150b0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70  allocated and op
150c0 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20  ened above..    
150d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53      */.        S
150e0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d  elect *pSelect =
150f0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
15100 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  t;.        ExprL
15110 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53  ist *pEList = pS
15120 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a  elect->pEList;..
15130 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15140 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  !isRowid );.    
15150 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48      /* If the LH
15160 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68 65  S and RHS of the
15170 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f 20   IN operator do 
15180 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74 0a  not match, that.
15190 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72          ** error
151a0 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
151b0 63 61 75 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f  caught long befo
151c0 72 65 20 77 65 20 72 65 61 63 68 20 74 68 69 73  re we reach this
151d0 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20   point. */.     
151e0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 45     if( ALWAYS(pE
151f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61  List->nExpr==nVa
15200 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
15210 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
15220 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
15230 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15240 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
15250 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74  t(&dest, SRT_Set
15260 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
15270 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 73 74  ;.          dest
15280 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70 72  .zAffSdst = expr
15290 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  INAffinity(pPars
152a0 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
152b0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
152c0 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30  xpr->iTable&0x00
152d0 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e  00FFFF)==pExpr->
152e0 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  iTable );.      
152f0 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69      pSelect->iLi
15300 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
15310 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65     testcase( pSe
15320 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
15330 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a   SF_Distinct );.
15340 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
15350 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  se( pKeyInfo==0 
15360 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20  ); /* Caused by 
15370 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65  OOM in sqlite3Ke
15380 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a  yInfoAlloc() */.
15390 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
153a0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
153b0 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
153c0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  st) ){.         
153d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
153e0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73  (pParse->db, des
153f0 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20  t.zAffSdst);.   
15400 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15410 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
15420 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  yInfo);.        
15430 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15450 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15460 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65  e(pParse->db, de
15470 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20  st.zAffSdst);.  
15480 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15490 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f  pKeyInfo!=0 ); /
154a0 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65  * OOM will cause
154b0 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c 69   exit after sqli
154c0 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20  te3Select() */. 
154d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
154e0 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
154f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15500 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
15510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
15520 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
15530 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
15540 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
15550 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15560 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
15570 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
15580 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
15590 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65  FieldSubexpr(pLe
155a0 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
155b0 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
155c0 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
155d0 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
155e0 6c 53 65 71 28 0a 20 20 20 20 20 20 20 20 20 20  lSeq(.          
155f0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c        pParse, p,
15600 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
15610 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  xpr.            
15620 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
15630 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15640 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
15650 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
15660 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0) ){.        /*
15670 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
15680 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
15690 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
156a0 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65     ** For each e
156b0 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64  xpression, build
156c0 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72   an index key fr
156d0 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  om the evaluatio
156e0 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
156f0 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
15700 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15710 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
15720 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
15730 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  e.        ** tha
15740 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
15750 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
15760 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
15770 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
15780 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d        ** a colum
15790 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61  n, use numeric a
157a0 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20  ffinity..       
157b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
157c0 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
157d0 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
157e0 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20  y of the LHS of 
157f0 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  the IN */.      
15800 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
15810 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
15820 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
15830 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  t;.        struc
15840 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
15850 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20  *pItem;.        
15860 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
15870 0a 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74  .        affinit
15880 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
15890 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a  ffinity(pLeft);.
158a0 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66          if( !aff
158b0 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
158c0 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51     affinity = SQ
158d0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
158e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
158f0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
15900 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
15910 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
15920 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
15930 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
15940 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
15950 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
15960 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
15970 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15980 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
15990 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
159a0 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
159b0 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
159c0 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
159d0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
159e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
159f0 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
15a00 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
15a10 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
15a20 69 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71  if( isRowid ) sq
15a30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15a40 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
15a50 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  2);.        for(
15a60 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  i=pList->nExpr, 
15a70 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
15a80 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
15a90 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
15aa0 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d  pr *pE2 = pItem-
15ab0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
15ac0 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b    int iValToIns;
15ad0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
15ae0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
15af0 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
15b00 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65   then we will ne
15b10 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
15b20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ** disable the t
15b30 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e  est that was gen
15b40 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61  erated above tha
15b50 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20  t makes sure.   
15b60 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
15b70 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65  ode only execute
15b80 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65  s once.  Because
15b90 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74   for a non-const
15ba0 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ant.          **
15bb0 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e   expression we n
15bc0 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69  eed to rerun thi
15bd0 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65  s code each time
15be0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
15bf0 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70           if( jmp
15c00 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20  IfDynamic>=0 && 
15c10 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
15c20 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20  nstant(pE2) ){. 
15c30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15c40 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
15c50 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d  op(v, jmpIfDynam
15c60 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ic);.           
15c70 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
15c80 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -1;.          }.
15c90 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
15ca0 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
15cb0 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
15cc0 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
15cd0 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
15ce0 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
15cf0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
15d00 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69  sInteger(pE2, &i
15d10 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20  ValToIns) ){.   
15d20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15d30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15d40 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70  _InsertInt, pExp
15d50 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69  r->iTable, r2, i
15d60 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20  ValToIns);.     
15d70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15d80 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c          r3 = sql
15d90 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
15da0 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20  et(pParse, pE2, 
15db0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
15dc0 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a   if( isRowid ){.
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
15de0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15df0 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
15e00 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15e30 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
15e40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
15e50 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15e70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15e80 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
15e90 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
15ea0 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20  2, r3);.        
15eb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15ec0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15ed0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
15ee0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c  _MakeRecord, r3,
15ef0 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74   1, r2, &affinit
15f00 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 1);.         
15f10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15f20 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
15f30 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20  nge(pParse, r3, 
15f40 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
15f50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f60 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
15f70 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
15f80 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  le, r2);.       
15f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15fa0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
15fb0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
15fc0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
15fd0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
15fe0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15ff0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
16000 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16010 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
16020 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16030 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
16040 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b  addr, (void *)pK
16050 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
16060 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
16070 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16080 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
16090 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
160a0 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66  _SELECT:.    def
160b0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
160c0 20 43 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c   Case 3:    (SEL
160d0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e  ECT ... FROM ...
160e0 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f  ).      **     o
160f0 72 3a 20 20 20 20 45 58 49 53 54 53 28 53 45 4c  r:    EXISTS(SEL
16100 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e  ECT ... FROM ...
16110 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ).      **.     
16120 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54   ** For a SELECT
16130 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
16140 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75 65  to put the value
16150 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  s for all column
16160 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  s of.      ** th
16170 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f  e first row into
16180 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
16190 69 73 74 65 72 73 20 61 6e 64 20 72 65 74 75 72  isters and retur
161a0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20  n the index of. 
161b0 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73       ** the firs
161c0 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20  t register..    
161d0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
161e0 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53   this is an EXIS
161f0 54 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74  TS, write an int
16200 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73  eger 0 (not exis
16210 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73  ts) or 1 (exists
16220 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ).      ** into 
16230 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 72  a register and r
16240 65 74 75 72 6e 20 74 68 61 74 20 72 65 67 69 73  eturn that regis
16250 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20  ter number..    
16260 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e    **.      ** In
16270 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65   both cases, the
16280 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e   query is augmen
16290 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20  ted with "LIMIT 
162a0 31 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20  1".  Any .      
162b0 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c  ** preexisting l
162c0 69 6d 69 74 20 69 73 20 64 69 73 63 61 72 64 65  imit is discarde
162d0 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  d in place of th
162e0 65 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20  e new LIMIT 1.. 
162f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65       */.      Se
16300 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
16330 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64  atement to encod
16340 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  e */.      Selec
16350 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20   /* How to deal 
16380 77 69 74 68 20 53 45 4c 45 43 54 20 72 65 73 75  with SELECT resu
16390 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
163a0 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163c0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74    /* Registers t
163d0 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20  o allocate */.. 
163e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
163f0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
16400 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
16410 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
16420 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
16430 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
16440 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
16450 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  S || pExpr->op==
16460 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
16470 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
16480 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16490 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
164a0 29 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d  );..      pSel =
164b0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
164c0 74 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20  t;.      nReg = 
164d0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
164e0 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c  LECT ? pSel->pEL
164f0 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a  ist->nExpr : 1;.
16500 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
16510 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
16520 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d  t, 0, pParse->nM
16530 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61  em+1);.      pPa
16540 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
16550 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  g;.      if( pEx
16560 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
16570 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73  T ){.        des
16580 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65  t.eDest = SRT_Me
16590 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  m;.        dest.
165a0 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44  iSdst = dest.iSD
165b0 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65  Parm;.        de
165c0 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b  st.nSdst = nReg;
165d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
165e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
165f0 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
16600 53 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44  SDParm, dest.iSD
16610 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20  Parm+nReg-1);.  
16620 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
16630 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71  t((v, "Init subq
16640 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
16650 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16660 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
16670 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20  = SRT_Exists;.  
16680 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16690 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
166a0 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69  teger, 0, dest.i
166b0 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  SDParm);.       
166c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
166d0 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65   "Init EXISTS re
166e0 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
166f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16700 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
16710 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69  >db, pSel->pLimi
16720 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  t);.      pSel->
16730 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
16740 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
16750 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a  _INTEGER, 0, 0,.
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16780 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b    &sqlite3IntTok
16790 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70  ens[1]);.      p
167a0 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  Sel->iLimit = 0;
167b0 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c  .      pSel->sel
167c0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c  Flags &= ~SF_Mul
167d0 74 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 69  tiValue;.      i
167e0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
167f0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26  (pParse, pSel, &
16800 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
16810 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
16820 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20   }.      rReg = 
16830 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
16840 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
16850 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
16860 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
16870 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16880 20 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75   }..  if( rHasNu
16890 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71  llFlag ){.    sq
168a0 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
168b0 6c 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54  lag(v, pExpr->iT
168c0 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c  able, rHasNullFl
168d0 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ag);.  }..  if( 
168e0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20  jmpIfDynamic>=0 
168f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16900 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
16910 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d  pIfDynamic);.  }
16920 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
16930 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
16940 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a  .  return rReg;.
16950 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
16960 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
16970 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
16980 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16990 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e  Y./*.** Expr pIn
169a0 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65   is an IN(...) e
169b0 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20  xpression. This 
169c0 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
169d0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62  that the .** sub
169e0 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52  -select on the R
169f0 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f  HS of the IN() o
16a00 70 65 72 61 74 6f 72 20 68 61 73 20 74 68 65 20  perator has the 
16a10 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a  same number of .
16a20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68  ** columns as th
16a30 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20  e vector on the 
16a40 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  LHS. Or, if the 
16a50 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20  RHS of the IN() 
16a60 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62  is not .** a sub
16a70 2d 71 75 65 72 79 2c 20 74 68 61 74 20 74 68 65  -query, that the
16a80 20 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f 72   LHS is a vector
16a90 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69   of size 1..*/.i
16aa0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  nt sqlite3ExprCh
16ab0 65 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61  eckIN(Parse *pPa
16ac0 72 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b  rse, Expr *pIn){
16ad0 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d  .  int nVector =
16ae0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
16af0 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66  orSize(pIn->pLef
16b00 74 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e  t);.  if( (pIn->
16b10 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
16b20 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28  lect) ){.    if(
16b30 20 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78   nVector!=pIn->x
16b40 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
16b50 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
16b60 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
16b70 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
16b80 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  In->x.pSelect->p
16b90 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56  EList->nExpr, nV
16ba0 65 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65  ector);.      re
16bb0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
16bc0 7d 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f  }else if( nVecto
16bd0 72 21 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  r!=1 ){.    if( 
16be0 28 70 49 6e 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  (pIn->pLeft->fla
16bf0 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
16c00 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
16c10 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
16c20 72 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f  r(pParse, nVecto
16c30 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  r, 1);.    }else
16c40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
16c50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16c60 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
16c70 65 64 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ed");.    }.    
16c80 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
16c90 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
16ca0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
16cb0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
16cc0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
16cd0 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65  code for an IN e
16ce0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
16cf0 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45        x IN (SELE
16d00 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20  CT ...).**      
16d10 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
16d20 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ue, ...).**.** T
16d30 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
16d40 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61  e (LHS) is a sca
16d50 6c 61 72 20 6f 72 20 76 65 63 74 6f 72 20 65 78  lar or vector ex
16d60 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 0a  pression.  The .
16d70 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
16d80 64 65 20 28 52 48 53 29 20 69 73 20 61 6e 20 61  de (RHS) is an a
16d90 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20  rray of zero or 
16da0 6d 6f 72 65 20 73 63 61 6c 61 72 20 76 61 6c 75  more scalar valu
16db0 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75 62 71  es, or a.** subq
16dc0 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 52 48  uery.  If the RH
16dd0 53 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  S is a subquery,
16de0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16df0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 75  esult columns mu
16e00 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65 20  st.** match the 
16e10 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
16e20 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 20  s in the vector 
16e30 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20 49 66 20  on the LHS.  If 
16e40 74 68 65 20 52 48 53 20 69 73 0a 2a 2a 20 61 20  the RHS is.** a 
16e50 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2c 20  list of values, 
16e60 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20  the LHS must be 
16e70 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a  a scalar. .**.**
16e80 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   The IN operator
16e90 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
16ea0 4c 48 53 20 76 61 6c 75 65 20 69 73 20 63 6f 6e  LHS value is con
16eb0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
16ec0 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20 72 65  e RHS..** The re
16ed0 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20 69 66  sult is false if
16ee0 20 74 68 65 20 4c 48 53 20 69 73 20 64 65 66 69   the LHS is defi
16ef0 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20 74 68  nitely not in th
16f00 65 20 52 48 53 2e 20 20 54 68 65 20 0a 2a 2a 20  e RHS.  The .** 
16f10 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69  result is NULL i
16f20 66 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  f the presence o
16f30 66 20 74 68 65 20 4c 48 53 20 69 6e 20 74 68 65  f the LHS in the
16f40 20 52 48 53 20 63 61 6e 6e 6f 74 20 62 65 20 0a   RHS cannot be .
16f50 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 64 75  ** determined du
16f60 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a  e to NULLs..**.*
16f70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
16f80 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
16f90 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74  at jumps to dest
16fa0 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c  IfFalse if the L
16fb0 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  HS is not .** co
16fc0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
16fd0 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65 20  he RHS.  If due 
16fe0 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e  to NULLs we cann
16ff0 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  ot determine if 
17000 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f  the LHS.** is co
17010 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
17020 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  HS then jump to 
17030 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20  destIfNull.  If 
17040 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
17050 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ined.** within t
17060 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c  he RHS then fall
17070 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20   through..**.** 
17080 53 65 65 20 74 68 65 20 73 65 70 61 72 61 74 65  See the separate
17090 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20   in-operator.md 
170a0 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69  documentation fi
170b0 6c 65 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e 69  le in the canoni
170c0 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20 73 6f  cal.** SQLite so
170d0 75 72 63 65 20 74 72 65 65 20 66 6f 72 20 61 64  urce tree for ad
170e0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
170f0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
17100 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
17110 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
17120 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
17130 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
17140 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
17150 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
17160 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
17170 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
17180 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
17190 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
171a0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
171b0 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
171c0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
171d0 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
171e0 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
171f0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
17200 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
17210 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
17220 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
17230 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
17240 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
17250 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
17260 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
17270 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54  lues */.  int eT
17280 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
17290 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52  /* Type of the R
172a0 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73  HS */.  int rLhs
172b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
172c0 20 52 65 67 69 73 74 65 72 28 73 29 20 68 6f 6c   Register(s) hol
172d0 64 69 6e 67 20 74 68 65 20 4c 48 53 20 76 61 6c  ding the LHS val
172e0 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68  ues */.  int rLh
172f0 73 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 2f  sOrig;         /
17300 2a 20 4c 48 53 20 76 61 6c 75 65 73 20 70 72 69  * LHS values pri
17310 6f 72 20 74 6f 20 72 65 6f 72 64 65 72 69 6e 67  or to reordering
17320 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20   by aiMap[] */. 
17330 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
17340 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
17350 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
17360 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
17370 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20  *aiMap = 0;     
17380 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65    /* Map from ve
17390 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20 69 6e  ctor field to in
173a0 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  dex column */.  
173b0 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20  char *zAff = 0; 
173c0 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
173d0 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d  y string for com
173e0 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e  parisons */.  in
173f0 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20 20 20  t nVector;      
17400 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76      /* Size of v
17410 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69 73 20  ectors for this 
17420 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
17430 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20 20 20   int iDummy;    
17440 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20         /* Dummy 
17450 70 61 72 61 6d 65 74 65 72 20 74 6f 20 65 78 70  parameter to exp
17460 72 43 6f 64 65 56 65 63 74 6f 72 28 29 20 2a 2f  rCodeVector() */
17470 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20  .  Expr *pLeft; 
17480 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17490 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
174a0 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
174b0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
174c0 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74 65    /* loop counte
174d0 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53  r */.  int destS
174e0 74 65 70 32 3b 20 20 20 20 20 20 20 20 2f 2a 20  tep2;        /* 
174f0 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 77 68  Where to jump wh
17500 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20 69 6e  en NULLs seen in
17510 20 73 74 65 70 20 32 20 2a 2f 0a 20 20 69 6e 74   step 2 */.  int
17520 20 64 65 73 74 53 74 65 70 36 20 3d 20 30 3b 20   destStep6 = 0; 
17530 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63     /* Start of c
17540 6f 64 65 20 66 6f 72 20 53 74 65 70 20 36 20 2a  ode for Step 6 *
17550 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 72 75 74  /.  int addrTrut
17560 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  hOp;      /* Add
17570 72 65 73 73 20 6f 66 20 6f 70 63 6f 64 65 20 74  ress of opcode t
17580 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 74  hat determines t
17590 68 65 20 49 4e 20 69 73 20 74 72 75 65 20 2a 2f  he IN is true */
175a0 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f 74 4e 75  .  int destNotNu
175b0 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ll;      /* Jump
175c0 20 68 65 72 65 20 69 66 20 61 20 63 6f 6d 70 61   here if a compa
175d0 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74 72 75  rison is not tru
175e0 65 20 69 6e 20 73 74 65 70 20 36 20 2a 2f 0a 20  e in step 6 */. 
175f0 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
17600 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
17610 20 74 68 65 20 73 74 65 70 2d 36 20 6c 6f 6f 70   the step-6 loop
17620 20 2a 2f 20 0a 0a 20 20 70 4c 65 66 74 20 3d 20   */ ..  pLeft = 
17630 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
17640 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
17650 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70  heckIN(pParse, p
17660 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a  Expr) ) return;.
17670 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41    zAff = exprINA
17680 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
17690 70 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f  pExpr);.  nVecto
176a0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  r = sqlite3ExprV
176b0 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d  ectorSize(pExpr-
176c0 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70  >pLeft);.  aiMap
176d0 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
176e0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  DbMallocZero(.  
176f0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
17700 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28  nVector*(sizeof(
17710 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68  int) + sizeof(ch
17720 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20  ar)) + 1.  );.  
17730 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
17740 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
17750 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
17760 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b  odeIN_oom_error;
17770 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74  ..  /* Attempt t
17780 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48  o compute the RH
17790 53 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74  S. After this st
177a0 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ep, if anything 
177b0 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  other than.  ** 
177c0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
177d0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74   returned, the t
177e0 61 62 6c 65 20 6f 70 65 6e 65 64 20 69 74 68 20  able opened ith 
177f0 63 75 72 73 6f 72 20 70 45 78 70 72 2d 3e 69 54  cursor pExpr->iT
17800 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 61  able .  ** conta
17810 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74  ins the values t
17820 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
17830 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58  RHS. If IN_INDEX
17840 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65  _NOOP is returne
17850 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48 53 20  d,.  ** the RHS 
17860 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
17870 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20   coded.  */.  v 
17880 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
17890 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
178a0 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20  );       /* OOM 
178b0 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74  detected prior t
178c0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  o this routine *
178d0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
178e0 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49  ent((v, "begin I
178f0 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79  N expr"));.  eTy
17900 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
17910 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
17920 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  pExpr,.         
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d      IN_INDEX_MEM
17950 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44  BERSHIP | IN_IND
17960 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20  EX_NOOP_OK,.    
17970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17980 20 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46           destIfF
17990 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
179a0 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e   ? 0 : &rRhsHasN
179b0 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a 20 20  ull, aiMap);..  
179c0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
179d0 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d  nErr || nVector=
179e0 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f  =1 || eType==IN_
179f0 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20  INDEX_EPH.      
17a00 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
17a10 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c  DEX_INDEX_ASC ||
17a20 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
17a30 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29  _INDEX_DESC .  )
17a40 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
17a50 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69  DEBUG.  /* Confi
17a60 72 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20  rm that aiMap[] 
17a70 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72  contains nVector
17a80 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
17a90 62 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20  between 0 and.  
17aa0 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f  ** nVector-1. */
17ab0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
17ac0 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
17ad0 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20   int j, cnt;.   
17ae0 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c   for(cnt=j=0; j<
17af0 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66  nVector; j++) if
17b00 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20  ( aiMap[j]==i ) 
17b10 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  cnt++;.    asser
17b20 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d  t( cnt==1 );.  }
17b30 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
17b40 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20  de the LHS, the 
17b50 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
17b60 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49  pr> IN (...)". I
17b70 66 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a  f the LHS is a .
17b80 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65    ** vector, the
17b90 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69  n it is stored i
17ba0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56  n an array of nV
17bb0 65 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  ector registers 
17bc0 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61  starting .  ** a
17bd0 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t r1..  **.  ** 
17be0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
17bf0 65 78 28 29 20 6d 69 67 68 74 20 68 61 76 65 20  ex() might have 
17c00 72 65 6f 72 64 65 72 65 64 20 74 68 65 20 66 69  reordered the fi
17c10 65 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20  elds of the LHS 
17c20 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74  vector.  ** so t
17c30 68 61 74 20 74 68 65 20 66 69 65 6c 64 73 20 61  hat the fields a
17c40 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f  re in the same o
17c50 72 64 65 72 20 61 73 20 61 6e 20 65 78 69 73 74  rder as an exist
17c60 69 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65  ing index.   The
17c70 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72  .  ** aiMap[] ar
17c80 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ray contains a m
17c90 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  apping from the 
17ca0 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65  original LHS fie
17cb0 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  ld order to.  **
17cc0 20 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72   the field order
17cd0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
17ce0 65 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a  e RHS index..  *
17cf0 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
17d00 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
17d10 3b 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65  ;.  rLhsOrig = e
17d20 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
17d30 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44  arse, pLeft, &iD
17d40 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ummy);.  for(i=0
17d50 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61  ; i<nVector && a
17d60 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29  iMap[i]==i; i++)
17d70 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69  {} /* Are LHS fi
17d80 65 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20  elds reordered? 
17d90 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63  */.  if( i==nVec
17da0 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48  tor ){.    /* LH
17db0 53 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74  S fields are not
17dc0 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20   reordered */.  
17dd0 20 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69    rLhs = rLhsOri
17de0 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
17df0 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64  /* Need to reord
17e00 65 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64  er the LHS field
17e10 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61  s according to a
17e20 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73  iMap */.    rLhs
17e30 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17e40 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
17e50 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72  Vector);.    for
17e60 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
17e70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
17e80 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17e90 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f  , OP_Copy, rLhsO
17ea0 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61  rig+i, rLhs+aiMa
17eb0 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  p[i], 0);.    }.
17ec0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c    }..  /* If sql
17ed0 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
17ee0 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f  ) did not find o
17ef0 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  r create an inde
17f00 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73  x that is.  ** s
17f10 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c  uitable for eval
17f20 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70  uating the IN op
17f30 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61  erator, then eva
17f40 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20  luate using a.  
17f50 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63  ** sequence of c
17f60 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a  omparisons..  **
17f70 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74  .  ** This is st
17f80 65 70 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e  ep (1) in the in
17f90 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74  -operator.md opt
17fa0 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d  imized algorithm
17fb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
17fc0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  pe==IN_INDEX_NOO
17fd0 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  P ){.    ExprLis
17fe0 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
17ff0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43  ->x.pList;.    C
18000 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
18010 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
18020 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
18030 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e  ->pLeft);.    in
18040 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69  t labelOk = sqli
18050 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18060 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c  (v);.    int r2,
18070 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20   regToFree;.    
18080 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20  int regCkNull = 
18090 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  0;.    int ii;. 
180a0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
180b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
180c0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
180d0 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74   );.    if( dest
180e0 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61  IfNull!=destIfFa
180f0 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67  lse ){.      reg
18100 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  CkNull = sqlite3
18110 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
18120 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
18130 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
18140 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20  P_BitAnd, rLhs, 
18150 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  rLhs, regCkNull)
18160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
18170 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e  ii=0; ii<pList->
18180 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
18190 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
181a0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
181b0 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69  rse, pList->a[ii
181c0 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46  ].pExpr, &regToF
181d0 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ree);.      if( 
181e0 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c  regCkNull && sql
181f0 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
18200 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  l(pList->a[ii].p
18210 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
18220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18230 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c  p3(v, OP_BitAnd,
18240 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20   regCkNull, r2, 
18250 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
18260 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69    }.      if( ii
18270 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
18280 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64  || destIfNull!=d
18290 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
182a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
182b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71  eAddOp4(v, OP_Eq
182c0 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c  , rLhs, labelOk,
182d0 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
182f0 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
18300 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
18310 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
18320 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  (v, ii<pList->nE
18330 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  xpr-1);.        
18340 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
18350 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78  , ii==pList->nEx
18360 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73  pr-1);.        s
18370 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
18380 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a  P5(v, zAff[0]);.
18390 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
183a0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
183b0 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
183c0 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20  alse );.        
183d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
183e0 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73  4(v, OP_Ne, rLhs
183f0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
18400 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
18420 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  id*)pColl, P4_CO
18430 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65  LLSEQ); VdbeCove
18440 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
18450 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
18460 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20  geP5(v, zAff[0] 
18470 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  | SQLITE_JUMPIFN
18480 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
18490 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
184a0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
184b0 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20  , regToFree);.  
184c0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43    }.    if( regC
184d0 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  kNull ){.      s
184e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
184f0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
18500 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66  egCkNull, destIf
18510 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  Null); VdbeCover
18520 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
18530 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
18540 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
18550 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
18560 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18570 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20  (v, labelOk);.  
18580 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18590 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
185a0 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
185b0 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  goto sqlite3Expr
185c0 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b  CodeIN_finished;
185d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
185e0 32 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  2: Check to see 
185f0 69 66 20 74 68 65 20 4c 48 53 20 63 6f 6e 74 61  if the LHS conta
18600 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c  ins any NULL col
18610 75 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a 20 20  umns.  If the.  
18620 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74  ** LHS does cont
18630 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74  ain NULLs then t
18640 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62  he result must b
18650 65 20 65 69 74 68 65 72 20 46 41 4c 53 45 20 6f  e either FALSE o
18660 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20  r NULL..  ** We 
18670 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20 74  will then skip t
18680 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
18690 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   of the RHS..  *
186a0 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e 75  /.  if( destIfNu
186b0 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll==destIfFalse 
186c0 29 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32  ){.    destStep2
186d0 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   = destIfFalse;.
186e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73    }else{.    des
186f0 74 53 74 65 70 32 20 3d 20 64 65 73 74 53 74 65  tStep2 = destSte
18700 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p6 = sqlite3Vdbe
18710 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18720 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
18730 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
18740 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
18750 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
18760 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  bexpr(pExpr->pLe
18770 66 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ft, i);.    if( 
18780 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
18790 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20 20  Null(p) ){.     
187a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
187b0 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
187c0 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 53 74 65   rLhs+i, destSte
187d0 70 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  p2);.      VdbeC
187e0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
187f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  }.  }..  /* Step
18800 20 33 2e 20 20 54 68 65 20 4c 48 53 20 69 73 20   3.  The LHS is 
18810 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20  now known to be 
18820 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74 68  non-NULL.  Do th
18830 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 0a  e binary search.
18840 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 20    ** of the RHS 
18850 75 73 69 6e 67 20 74 68 65 20 4c 48 53 20 61 73  using the LHS as
18860 20 61 20 70 72 6f 62 65 2e 20 20 49 66 20 66 6f   a probe.  If fo
18870 75 6e 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20  und, the result 
18880 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a 20 20  is.  ** true..  
18890 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
188a0 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29  IN_INDEX_ROWID )
188b0 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
188c0 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69   case, the RHS i
188d0 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  s the ROWID of t
188e0 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e 64 20  able b-tree and 
188f0 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20 20 2a  so we also.    *
18900 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  * know that the 
18910 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e  RHS is non-NULL.
18920 20 20 48 65 6e 63 65 2c 20 77 65 20 63 6f 6d 62    Hence, we comb
18930 69 6e 65 20 73 74 65 70 73 20 33 20 61 6e 64 20  ine steps 3 and 
18940 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20  4.    ** into a 
18950 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 2a  single opcode. *
18960 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
18970 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
18980 65 6b 52 6f 77 69 64 2c 20 70 45 78 70 72 2d 3e  ekRowid, pExpr->
18990 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
189a0 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20  lse, rLhs);.    
189b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
189c0 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70  .    addrTruthOp
189d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
189e0 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
189f0 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75  ;  /* Return Tru
18a00 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e */.  }else{.  
18a10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18a20 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op4(v, OP_Affini
18a30 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f  ty, rLhs, nVecto
18a40 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63  r, 0, zAff, nVec
18a50 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65  tor);.    if( de
18a60 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
18a70 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f  fNull ){.      /
18a80 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33  * Combine Step 3
18a90 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f   and Step 5 into
18aa0 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
18ab0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
18ac0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
18ad0 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70  , OP_NotFound, p
18ae0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
18af0 73 74 49 66 46 61 6c 73 65 2c 0a 20 20 20 20 20  stIfFalse,.     
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63        rLhs, nVec
18b20 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  tor); VdbeCovera
18b30 67 65 28 76 29 3b 0a 20 20 20 20 20 20 67 6f 74  ge(v);.      got
18b40 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  o sqlite3ExprCod
18b50 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  eIN_finished;.  
18b60 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64 69 6e    }.    /* Ordin
18b70 61 72 79 20 53 74 65 70 20 33 2c 20 66 6f 72 20  ary Step 3, for 
18b80 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 46  the case where F
18b90 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20 61 72  ALSE and NULL ar
18ba0 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
18bb0 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20    addrTruthOp = 
18bc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18bd0 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
18be0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
18bf0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20            rLhs, 
18c20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f  nVector); VdbeCo
18c30 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
18c40 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66    /* Step 4.  If
18c50 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77   the RHS is know
18c60 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  n to be non-NULL
18c70 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20   and we did not 
18c80 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74  find.  ** an mat
18c90 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68  ch on the search
18ca0 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
18cb0 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
18cc0 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66  FALSE..  */.  if
18cd0 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26  ( rRhsHasNull &&
18ce0 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20   nVector==1 ){. 
18cf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18d00 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
18d10 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  ll, rRhsHasNull,
18d20 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
18d30 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
18d40 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  v);.  }..  /* St
18d50 65 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20  ep 5.  If we do 
18d60 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
18d70 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
18d80 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20  tween NULL and. 
18d90 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20   ** FALSE, then 
18da0 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73  just return fals
18db0 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e. .  */.  if( d
18dc0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
18dd0 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33  IfNull ) sqlite3
18de0 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
18df0 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20  IfFalse);..  /* 
18e00 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72  Step 6: Loop thr
18e10 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65  ough rows of the
18e20 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65   RHS.  Compare e
18e30 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c  ach row to the L
18e40 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20  HS..  ** If any 
18e50 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55  comparison is NU
18e60 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  LL, then the res
18e70 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66  ult is NULL.  If
18e80 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72   all.  ** compar
18e90 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20  isons are FALSE 
18ea0 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72  then the final r
18eb0 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a  esult is FALSE..
18ec0 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20    **.  ** For a 
18ed0 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69  scalar LHS, it i
18ee0 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
18ef0 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66  check just the f
18f00 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66  irst row.  ** of
18f10 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
18f20 20 69 66 28 20 64 65 73 74 53 74 65 70 36 20 29   if( destStep6 )
18f30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18f40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
18f50 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f  Step6);.  addrTo
18f60 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
18f70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
18f80 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
18f90 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  e, destIfFalse);
18fa0 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
18fb0 76 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f  v);.  if( nVecto
18fc0 72 3e 31 20 29 7b 0a 20 20 20 20 64 65 73 74 4e  r>1 ){.    destN
18fd0 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  otNull = sqlite3
18fe0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18ff0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
19000 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72 3d 3d 31  * For nVector==1
19010 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20  , combine steps 
19020 36 20 61 6e 64 20 37 20 62 79 20 69 6d 6d 65 64  6 and 7 by immed
19030 69 61 74 65 6c 79 20 72 65 74 75 72 6e 69 6e 67  iately returning
19040 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66  .    ** FALSE if
19050 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61   the first compa
19060 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c  rison is not NUL
19070 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74 4e 6f 74  L */.    destNot
19080 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66 46 61 6c  Null = destIfFal
19090 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  se;.  }.  for(i=
190a0 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
190b0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
190c0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
190d0 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 33 20  oll;.    int r3 
190e0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
190f0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
19100 20 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74   p = sqlite3Vect
19110 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
19120 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 70 43  Left, i);.    pC
19130 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
19140 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
19150 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   p);.    sqlite3
19160 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19170 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  _Column, pExpr->
19180 69 54 61 62 6c 65 2c 20 69 2c 20 72 33 29 3b 0a  iTable, i, r3);.
19190 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
191a0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp4(v, OP_Ne, 
191b0 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e  rLhs+i, destNotN
191c0 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  ull, r3,.       
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
191e0 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
191f0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56 64  COLLSEQ);.    Vd
19200 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19210 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19220 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19230 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   r3);.  }.  sqli
19240 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19250 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
19260 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20  tIfNull);.  if( 
19270 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
19280 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
19290 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
192a0 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  NotNull);.    sq
192b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
192c0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 45 78 70  v, OP_Next, pExp
192d0 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 54  r->iTable, addrT
192e0 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64 62 65 43  op+1);.    VdbeC
192f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
19300 20 2f 2a 20 53 74 65 70 20 37 3a 20 20 49 66 20   /* Step 7:  If 
19310 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
19320 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61  int, we know tha
19330 74 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73  t the result mus
19340 74 0a 20 20 20 20 2a 2a 20 62 65 20 66 61 6c 73  t.    ** be fals
19350 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
19360 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19370 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
19380 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  fFalse);.  }..  
19390 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65 20 69 6e  /* Jumps here in
193a0 20 6f 72 64 65 72 20 74 6f 20 72 65 74 75 72 6e   order to return
193b0 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71 6c 69   true. */.  sqli
193c0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
193d0 76 2c 20 61 64 64 72 54 72 75 74 68 4f 70 29 3b  v, addrTruthOp);
193e0 0a 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ..sqlite3ExprCod
193f0 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20  eIN_finished:.  
19400 69 66 28 20 72 4c 68 73 21 3d 72 4c 68 73 4f 72  if( rLhs!=rLhsOr
19410 69 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65  ig ) sqlite3Rele
19420 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
19430 65 2c 20 72 4c 68 73 29 3b 0a 20 20 73 71 6c 69  e, rLhs);.  sqli
19440 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
19450 70 50 61 72 73 65 29 3b 0a 20 20 56 64 62 65 43  pParse);.  VdbeC
19460 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
19470 49 4e 20 65 78 70 72 22 29 29 3b 0a 73 71 6c 69  IN expr"));.sqli
19480 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f  te3ExprCodeIN_oo
19490 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74  m_error:.  sqlit
194a0 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
194b0 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20 73  >db, aiMap);.  s
194c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
194d0 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a  rse->db, zAff);.
194e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
194f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
19500 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
19510 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
19520 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65  G_POINT./*.** Ge
19530 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
19540 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
19550 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67  put the floating
19560 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20   point.** value 
19570 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30  described by z[0
19580 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
19590 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
195a0 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20   The z[] string 
195b0 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f  will probably no
195c0 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  t be zero-termin
195d0 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a  ated.  But the .
195e0 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65  ** z[n] characte
195f0 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
19600 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20  to be something 
19610 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f  that does not lo
19620 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63  ok.** like the c
19630 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74  ontinuation of t
19640 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  he number..*/.st
19650 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65  atic void codeRe
19660 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  al(Vdbe *v, cons
19670 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
19680 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69  egateFlag, int i
19690 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  Mem){.  if( ALWA
196a0 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20  YS(z!=0) ){.    
196b0 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20  double value;.  
196c0 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c    sqlite3AtoF(z,
196d0 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33   &value, sqlite3
196e0 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
196f0 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61  ITE_UTF8);.    a
19700 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49  ssert( !sqlite3I
19710 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f  sNaN(value) ); /
19720 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e  * The new AtoF n
19730 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e  ever returns NaN
19740 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61   */.    if( nega
19750 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  teFlag ) value =
19760 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c   -value;.    sql
19770 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
19780 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30  p8(v, OP_Real, 0
19790 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29  , iMem, 0, (u8*)
197a0 26 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29  &value, P4_REAL)
197b0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
197c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
197d0 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
197e0 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
197f0 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
19800 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
19810 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
19820 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
19830 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69   Expr.u.zToken i
19840 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e  s always UTF8 an
19850 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  d zero-terminate
19860 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
19870 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61  d codeInteger(Pa
19880 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
19890 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65  r *pExpr, int ne
198a0 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  gFlag, int iMem)
198b0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
198c0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
198d0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
198e0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
198f0 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78  .    int i = pEx
19900 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20  pr->u.iValue;.  
19910 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29    assert( i>=0 )
19920 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61  ;.    if( negFla
19930 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20  g ) i = -i;.    
19940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19950 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
19960 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c   i, iMem);.  }el
19970 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20  se{.    int c;. 
19980 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
19990 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
199a0 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
199b0 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  n;.    assert( z
199c0 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73  !=0 );.    c = s
199d0 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
199e0 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a  I64(z, &value);.
199f0 20 20 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20      if( c==0 || 
19a00 28 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67  (c==2 && negFlag
19a10 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ) ){.      if( n
19a20 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20  egFlag ){ value 
19a30 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53  = c==2 ? SMALLES
19a40 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65  T_INT64 : -value
19a50 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ; }.      sqlite
19a60 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
19a70 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20  v, OP_Int64, 0, 
19a80 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76  iMem, 0, (u8*)&v
19a90 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b  alue, P4_INT64);
19aa0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64  .    }else{.#ifd
19ab0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
19ac0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
19ad0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19ae0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65  Msg(pParse, "ove
19af0 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20  rsized integer: 
19b00 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f  %s%s", negFlag ?
19b10 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23   "-" : "", z);.#
19b20 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
19b30 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54  ITE_OMIT_HEX_INT
19b40 45 47 45 52 0a 20 20 20 20 20 20 69 66 28 20 73  EGER.      if( s
19b50 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
19b60 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a  z,"0x",2)==0 ){.
19b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19b80 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
19b90 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f  "hex literal too
19ba0 20 62 69 67 3a 20 25 73 22 2c 20 7a 29 3b 0a 20   big: %s", z);. 
19bb0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
19bc0 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
19bd0 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c    codeReal(v, z,
19be0 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b   negFlag, iMem);
19bf0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
19c00 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
19c10 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
19c20 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 56 65 72  DEBUG)./*.** Ver
19c30 69 66 79 20 74 68 65 20 63 6f 6e 73 69 73 74 65  ify the consiste
19c40 6e 63 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ncy of the colum
19c50 6e 20 63 61 63 68 65 0a 2a 2f 0a 73 74 61 74 69  n cache.*/.stati
19c60 63 20 69 6e 74 20 63 61 63 68 65 49 73 56 61 6c  c int cacheIsVal
19c70 69 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  id(Parse *pParse
19c80 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
19c90 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 53 51   for(i=n=0; i<SQ
19ca0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
19cb0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
19cc0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
19cd0 5b 69 5d 2e 69 52 65 67 3e 30 20 29 20 6e 2b 2b  [i].iReg>0 ) n++
19ce0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
19cf0 3d 3d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  ==pParse->nColCa
19d00 63 68 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  che;.}.#endif../
19d10 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61 63  *.** Clear a cac
19d20 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61  he entry..*/.sta
19d30 74 69 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e  tic void cacheEn
19d40 74 72 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a  tryClear(Parse *
19d50 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 79  pParse, struct y
19d60 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20 20  ColCache *p){.  
19d70 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20 29  if( p->tempReg )
19d80 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
19d90 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
19da0 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
19db0 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20  mpReg) ){.      
19dc0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
19dd0 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
19de0 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  g++] = p->iReg;.
19df0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d      }.    p->tem
19e00 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pReg = 0;.  }.  
19e10 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 70  p->iReg = 0;.  p
19e20 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
19e30 2d 2d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  --;.  assert( pP
19e40 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
19e50 46 61 69 6c 65 64 20 7c 7c 20 63 61 63 68 65 49  Failed || cacheI
19e60 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29  sValid(pParse) )
19e70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ;.}.../*.** Reco
19e80 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
19e90 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
19ea0 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
19eb0 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
19ec0 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
19ed0 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
19ee0 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
19ef0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
19f00 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
19f10 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
19f20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
19f30 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
19f40 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
19f50 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
19f60 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
19f70 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  he *p;..  /* Unl
19f80 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73  ess an error has
19f90 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73   occurred, regis
19fa0 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  ter numbers are 
19fb0 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e  always positive.
19fc0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52   */.  assert( iR
19fd0 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  eg>0 || pParse->
19fe0 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
19ff0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   );.  assert( iC
1a010 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33  ol>=-1 && iCol<3
1a020 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69  2768 );  /* Fini
1a030 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  te column number
1a040 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53  s */..  /* The S
1a050 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
1a060 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20  e flag disables 
1a070 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1a080 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  .  This is used.
1a090 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67    ** for testing
1a0a0 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66   only - to verif
1a0b0 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c  y that SQLite al
1a0c0 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61  ways gets the sa
1a0d0 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77  me answer.  ** w
1a0e0 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20  ith and without 
1a0f0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1a100 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..  */.  if( Opt
1a110 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
1a120 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
1a130 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
1a140 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
1a150 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20  * First replace 
1a160 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74  any existing ent
1a170 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ry..  **.  ** Ac
1a180 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20  tually, the way 
1a190 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1a1a0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73   is currently us
1a1b0 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61  ed, we are guara
1a1c0 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20  nteed.  ** that 
1a1d0 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  the object will 
1a1e0 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65  never already be
1a1f0 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69   in cache.  Veri
1a200 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  fy this guarante
1a210 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  e..  */.#ifndef 
1a220 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  NDEBUG.  for(i=0
1a230 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1a240 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
1a250 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
1a260 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   p++){.    asser
1a270 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c  t( p->iReg==0 ||
1a280 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62   p->iTable!=iTab
1a290 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d   || p->iColumn!=
1a2a0 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  iCol );.  }.#end
1a2b0 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e  if..  /* Find an
1a2c0 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20   empty slot and 
1a2d0 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20  replace it */.  
1a2e0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
1a2f0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
1a300 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
1a310 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
1a320 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30    if( p->iReg==0
1a330 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65   ){.      p->iLe
1a340 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
1a350 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20  acheLevel;.     
1a360 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61   p->iTable = iTa
1a370 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c  b;.      p->iCol
1a380 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
1a390 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67    p->iReg = iReg
1a3a0 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  ;.      p->tempR
1a3b0 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  eg = 0;.      p-
1a3c0 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
1a3d0 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
1a3e0 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61    pParse->nColCa
1a3f0 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  che++;.      ass
1a400 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
1a410 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
1a420 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70 50   cacheIsValid(pP
1a430 61 72 73 65 29 20 29 3b 0a 20 20 20 20 20 20 72  arse) );.      r
1a440 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
1a450 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74  ..  /* Replace t
1a460 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79  he last recently
1a470 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72   used */.  minLr
1a480 75 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a  u = 0x7fffffff;.
1a490 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20    idxLru = -1;. 
1a4a0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1a4b0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1a4c0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
1a4d0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
1a4e0 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69     if( p->lru<mi
1a4f0 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64  nLru ){.      id
1a500 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20  xLru = i;.      
1a510 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b  minLru = p->lru;
1a520 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1a530 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e 3d   ALWAYS(idxLru>=
1a540 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  0) ){.    p = &p
1a550 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1a560 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70 2d  [idxLru];.    p-
1a570 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  >iLevel = pParse
1a580 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20  ->iCacheLevel;. 
1a590 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69     p->iTable = i
1a5a0 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c  Tab;.    p->iCol
1a5b0 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
1a5c0 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
1a5d0 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
1a5e0 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d   0;.    p->lru =
1a5f0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
1a600 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  nt++;.    assert
1a610 28 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70  ( cacheIsValid(p
1a620 50 61 72 73 65 29 20 29 3b 0a 20 20 20 20 72 65  Parse) );.    re
1a630 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  turn;.  }.}../*.
1a640 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
1a650 20 72 65 67 69 73 74 65 72 73 20 62 65 74 77 65   registers betwe
1a660 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52  en iReg..iReg+nR
1a670 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f  eg-1 are being o
1a680 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50  verwritten..** P
1a690 75 72 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f  urge the range o
1a6a0 66 20 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d  f registers from
1a6b0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1a6c0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1a6d0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1a6e0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1a6f0 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
1a700 52 65 67 29 7b 0a 20 20 73 74 72 75 63 74 20 79  Reg){.  struct y
1a710 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 69  ColCache *p;.  i
1a720 66 28 20 69 52 65 67 3c 3d 30 20 7c 7c 20 70 50  f( iReg<=0 || pP
1a730 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3d  arse->nColCache=
1a740 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
1a750 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
1a760 43 61 63 68 65 5b 53 51 4c 49 54 45 5f 4e 5f 43  Cache[SQLITE_N_C
1a770 4f 4c 43 41 43 48 45 2d 31 5d 3b 0a 20 20 77 68  OLCACHE-1];.  wh
1a780 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 66 28 20  ile(1){.    if( 
1a790 70 2d 3e 69 52 65 67 20 3e 3d 20 69 52 65 67 20  p->iReg >= iReg 
1a7a0 26 26 20 70 2d 3e 69 52 65 67 20 3c 20 69 52 65  && p->iReg < iRe
1a7b0 67 2b 6e 52 65 67 20 29 20 63 61 63 68 65 45 6e  g+nReg ) cacheEn
1a7c0 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
1a7d0 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d   p);.    if( p==
1a7e0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1a7f0 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  e ) break;.    p
1a800 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  --;.  }.}../*.**
1a810 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75   Remember the cu
1a820 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63  rrent column cac
1a830 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79  he context.  Any
1a840 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64 64   new entries add
1a850 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74  ed.** added to t
1a860 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
1a870 61 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20  after this call 
1a880 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e  are removed when
1a890 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
1a8a0 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73  nding pop occurs
1a8b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a8c0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 50  3ExprCachePush(P
1a8d0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1a8e0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1a8f0 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53  evel++;.#ifdef S
1a900 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1a910 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
1a920 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
1a930 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
1a940 20 20 20 70 72 69 6e 74 66 28 22 50 55 53 48 20     printf("PUSH 
1a950 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65  to %d\n", pParse
1a960 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a  ->iCacheLevel);.
1a970 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
1a980 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20  .** Remove from 
1a990 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1a9a0 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61   any entries tha
1a9b0 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69 6e  t were added sin
1a9c0 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72  ce the.** the pr
1a9d0 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33 45 78  evious sqlite3Ex
1a9e0 70 72 43 61 63 68 65 50 75 73 68 20 6f 70 65 72  prCachePush oper
1a9f0 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ation.  In other
1aa00 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 0a   words, restore.
1aa10 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  ** the cache to 
1aa20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
1aa30 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20 6d 6f   in prior the mo
1aa40 73 74 20 72 65 63 65 6e 74 20 50 75 73 68 2e 0a  st recent Push..
1aa50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1aa60 78 70 72 43 61 63 68 65 50 6f 70 28 50 61 72 73  xprCachePop(Pars
1aa70 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
1aa80 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
1aa90 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73  olCache *p;.  as
1aaa0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43  sert( pParse->iC
1aab0 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a  acheLevel>=1 );.
1aac0 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
1aad0 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20  Level--;.#ifdef 
1aae0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
1aaf0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
1ab00 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
1ab10 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
1ab20 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20      printf("POP 
1ab30 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73   to %d\n", pPars
1ab40 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b  e->iCacheLevel);
1ab50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f  .  }.#endif.  fo
1ab60 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1ab70 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
1ab80 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
1ab90 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1aba0 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70  if( p->iReg && p
1abb0 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d  ->iLevel>pParse-
1abc0 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a  >iCacheLevel ){.
1abd0 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
1abe0 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
1abf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1ac00 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68  *.** When a cach
1ac10 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75  ed column is reu
1ac20 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  sed, make sure t
1ac30 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72  hat its register
1ac40 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
1ac50 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20   available as a 
1ac60 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20  temp register.  
1ac70 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74  ticket #3879:  t
1ac80 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69  hat same.** regi
1ac90 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e  ster might be in
1aca0 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75   the cache in mu
1acb0 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73  ltiple places, s
1acc0 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20  o be sure to.** 
1acd0 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f  get them all..*/
1ace0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1acf0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
1ad00 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a  Register(Parse *
1ad10 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
1ad20 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
1ad30 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1ad40 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
1ad50 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1ad60 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
1ad70 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
1ad80 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
1ad90 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
1ada0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
1adb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1adc0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1add0 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69  that will load i
1ade0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72 65 67  nto register reg
1adf0 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68 61 74  Out a value that
1ae00 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61   is.** appropria
1ae10 74 65 20 66 6f 72 20 74 68 65 20 69 49 64 78 43  te for the iIdxC
1ae20 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
1ae30 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76  index pIdx..*/.v
1ae40 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1ae50 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75  odeLoadIndexColu
1ae60 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
1ae70 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72  rse,  /* The par
1ae80 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1ae90 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
1aea0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
1aeb0 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74  hose column is t
1aec0 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  o be loaded */. 
1aed0 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
1aee0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1aef0 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72  ing to a table r
1af00 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ow */.  int iIdx
1af10 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63  Col,    /* The c
1af20 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1af30 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20  ex to be loaded 
1af40 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
1af50 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
1af60 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76  e index column v
1af70 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
1af80 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31  ister */.){.  i1
1af90 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78  6 iTabCol = pIdx
1afa0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43  ->aiColumn[iIdxC
1afb0 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43  ol];.  if( iTabC
1afc0 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20  ol==XN_EXPR ){. 
1afd0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1afe0 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20  >aColExpr );.   
1aff0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1b000 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69  ColExpr->nExpr>i
1b010 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50  IdxCol );.    pP
1b020 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
1b030 20 69 54 61 62 43 75 72 3b 0a 20 20 20 20 73 71   iTabCur;.    sq
1b040 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
1b050 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  y(pParse, pIdx->
1b060 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78  aColExpr->a[iIdx
1b070 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f  Col].pExpr, regO
1b080 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
1b090 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1b0a0 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1b0b0 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
1b0c0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69   pIdx->pTable, i
1b0d0 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20  TabCur,.        
1b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
1b100 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1b110 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1b120 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72  ate code to extr
1b130 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  act the value of
1b140 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
1b150 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  umn of a table..
1b160 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1b170 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1b180 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20  OfTable(.  Vdbe 
1b190 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *v,        /* Th
1b1a0 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
1b1b0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  struction */.  T
1b1c0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f  able *pTab,    /
1b1d0 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * The table cont
1b1e0 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
1b1f0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
1b200 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  r,    /* The tab
1b210 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74  le cursor.  Or t
1b220 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72  he PK cursor for
1b230 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a   WITHOUT ROWID *
1b240 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
1b250 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1b260 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78  the column to ex
1b270 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  tract */.  int r
1b280 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78  egOut      /* Ex
1b290 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
1b2a0 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74  into this regist
1b2b0 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  er */.){.  if( i
1b2c0 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70  Col<0 || iCol==p
1b2d0 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
1b2e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b2f0 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
1b300 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74   iTabCur, regOut
1b310 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1b320 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
1b330 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
1b340 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
1b350 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69  n;.    int x = i
1b360 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61  Col;.    if( !Ha
1b370 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
1b380 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
1b390 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71   ){.      x = sq
1b3a0 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
1b3b0 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72  ex(sqlite3Primar
1b3c0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c  yKeyIndex(pTab),
1b3d0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
1b3e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b3f0 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43  Op3(v, op, iTabC
1b400 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a  ur, x, regOut);.
1b410 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
1b420 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1b430 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
1b440 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67   pTab, iCol, reg
1b450 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
1b460 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1b470 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
1b480 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
1b490 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
1b4a0 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
1b4b0 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
1b4c0 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69   value in a regi
1b4d0 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20  ster. .**.** An 
1b4e0 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
1b4f0 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  o store the colu
1b500 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  mn value in regi
1b510 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 69 73  ster iReg.  This
1b520 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72 61 6e  .** is not garan
1b530 74 65 65 65 64 20 66 6f 72 20 47 65 74 43 6f 6c  teeed for GetCol
1b540 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65 73 75  umn() - the resu
1b550 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  lt can be stored
1b560 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73   in.** any regis
1b570 74 65 72 2e 20 20 42 75 74 20 74 68 65 20 72 65  ter.  But the re
1b580 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74 65  sult is guarante
1b590 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65  ed to land in re
1b5a0 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a 20 66  gister iReg.** f
1b5b0 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65  or GetColumnToRe
1b5c0 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  g()..**.** There
1b5d0 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
1b5e0 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20   cursor to pTab 
1b5f0 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74  in iTable when t
1b600 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
1b610 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43  s called.  If iC
1b620 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64  olumn<0 then cod
1b630 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
1b640 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65  hat extracts the
1b650 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73   rowid..*/.int s
1b660 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1b670 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  tColumn(.  Parse
1b680 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
1b690 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
1b6a0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
1b6b0 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
1b6c0 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Tab,     /* Desc
1b6d0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
1b6e0 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64  able we are read
1b6f0 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ing from */.  in
1b700 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t iColumn,     /
1b710 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
1b720 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  able column */. 
1b730 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1b740 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1b750 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1b760 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1b770 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
1b780 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72  tore results her
1b790 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  e */.  u8 p5    
1b7a0 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61          /* P5 va
1b7b0 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d  lue for OP_Colum
1b7c0 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a  n + FLAGS */.){.
1b7d0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1b7e0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1b7f0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1b800 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
1b810 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1b820 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
1b830 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
1b840 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1b850 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26  if( p->iReg>0 &&
1b860 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62   p->iTable==iTab
1b870 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  le && p->iColumn
1b880 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
1b890 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
1b8a0 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
1b8b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b8c0 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
1b8d0 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52  er(pParse, p->iR
1b8e0 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  eg);.      retur
1b8f0 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  n p->iReg;.    }
1b900 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28  .  }  .  assert(
1b910 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
1b920 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1b930 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
1b940 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  ab, iTable, iCol
1b950 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66  umn, iReg);.  if
1b960 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( p5 ){.    sqli
1b970 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1b980 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b  v, p5);.  }else{
1b990 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45     .    sqlite3E
1b9a0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1b9b0 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43  arse, iTable, iC
1b9c0 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
1b9d0 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
1b9e0 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
1b9f0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1ba00 54 6f 52 65 67 28 0a 20 20 50 61 72 73 65 20 2a  ToReg(.  Parse *
1ba10 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
1ba20 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1ba30 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1ba40 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1ba50 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
1ba60 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
1ba70 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
1ba80 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
1ba90 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
1baa0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
1bab0 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
1bac0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1bad0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
1bae0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
1baf0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
1bb00 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g         /* Sto
1bb10 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
1bb20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d  */.){.  int r1 =
1bb30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bb40 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1bb50 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c  , pTab, iColumn,
1bb60 20 69 54 61 62 6c 65 2c 20 69 52 65 67 2c 20 30   iTable, iReg, 0
1bb70 29 3b 0a 20 20 69 66 28 20 72 31 21 3d 69 52 65  );.  if( r1!=iRe
1bb80 67 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  g ) sqlite3VdbeA
1bb90 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
1bba0 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  dbe, OP_SCopy, r
1bbb0 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a  1, iReg);.}.../*
1bbc0 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f  .** Clear all co
1bbd0 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69  lumn cache entri
1bbe0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1bbf0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
1bc00 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  r(Parse *pParse)
1bc10 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1bc20 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
1bc30 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  ;..#if SQLITE_DE
1bc40 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
1bc50 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1bc60 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1bc70 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
1bc80 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20  f("CLEAR\n");.  
1bc90 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  }.#endif.  for(i
1bca0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1bcb0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
1bcc0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
1bcd0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
1bce0 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20   p->iReg ){.    
1bcf0 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
1bd00 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
1bd10 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1bd20 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
1bd30 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74   that an affinit
1bd40 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63  y change has occ
1bd50 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a  urred on iCount.
1bd60 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61  ** registers sta
1bd70 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72  rting with iStar
1bd80 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1bd90 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1bda0 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20  ityChange(Parse 
1bdb0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74  *pParse, int iSt
1bdc0 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29  art, int iCount)
1bdd0 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
1bde0 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
1bdf0 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e  e, iStart, iCoun
1be00 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t);.}../*.** Gen
1be10 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  erate code to mo
1be20 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ve content from 
1be30 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
1be40 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
1be50 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
1be60 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20  To+nReg-1. Keep 
1be70 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1be80 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a   up-to-date..*/.
1be90 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1bea0 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a  CodeMove(Parse *
1beb0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
1bec0 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20  m, int iTo, int 
1bed0 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28  nReg){.  assert(
1bee0 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67   iFrom>=iTo+nReg
1bef0 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d   || iFrom+nReg<=
1bf00 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  iTo );.  sqlite3
1bf10 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
1bf20 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76  e->pVdbe, OP_Mov
1bf30 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e  e, iFrom, iTo, n
1bf40 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Reg);.  sqlite3E
1bf50 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1bf60 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52  Parse, iFrom, nR
1bf70 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  eg);.}..#if defi
1bf80 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1bf90 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1bfa0 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
1bfb0 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
1bfc0 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69  true if any regi
1bfd0 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67  ster in the rang
1bfe0 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e  e iFrom..iTo (in
1bff0 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75  clusive).** is u
1c000 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
1c010 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
1c020 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1c030 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68  ine is used with
1c040 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20  in assert() and 
1c050 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
1c060 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f  s only.** and do
1c070 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
1c080 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e   a normal build.
1c090 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1c0a0 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1c0b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c0c0 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
1c0d0 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  To){.  int i;.  
1c0e0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1c0f0 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
1c100 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1c110 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
1c120 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
1c130 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d  ++){.    int r =
1c140 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66   p->iReg;.    if
1c150 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c  ( r>=iFrom && r<
1c160 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b  =iTo ) return 1;
1c170 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
1c180 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1c190 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1c1a0 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49  TE_DEBUG || SQLI
1c1b0 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
1c1c0 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76   */.../*.** Conv
1c1d0 65 72 74 20 61 20 73 63 61 6c 61 72 20 65 78 70  ert a scalar exp
1c1e0 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20  ression node to 
1c1f0 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65  a TK_REGISTER re
1c200 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67  ferencing.** reg
1c210 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 65  ister iReg.  The
1c220 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
1c230 75 72 65 20 74 68 61 74 20 69 52 65 67 20 61 6c  ure that iReg al
1c240 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  ready contains.*
1c250 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  * the correct va
1c260 6c 75 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  lue for the expr
1c270 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ession..*/.stati
1c280 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67  c void exprToReg
1c290 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69  ister(Expr *p, i
1c2a0 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f  nt iReg){.  p->o
1c2b0 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d  p2 = p->op;.  p-
1c2c0 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
1c2d0 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  R;.  p->iTable =
1c2e0 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65   iReg;.  ExprCle
1c2f0 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  arProperty(p, EP
1c300 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Skip);.}../*.**
1c310 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   Evaluate an exp
1c320 72 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72 20  ression (either 
1c330 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
1c340 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29  alar expression)
1c350 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68   and store.** th
1c360 65 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74  e result in cont
1c370 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61 72  inguous temporar
1c380 79 20 72 65 67 69 73 74 65 72 73 2e 20 20 52 65  y registers.  Re
1c390 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1c3a0 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72  f.** the first r
1c3b0 65 67 69 73 74 65 72 20 75 73 65 64 20 74 6f 20  egister used to 
1c3c0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1c3d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
1c3e0 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72  eturned result r
1c3f0 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
1c400 70 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20 74  porary scalar, t
1c410 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a  hen also write.*
1c420 2a 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  * that register 
1c430 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69 46  number into *piF
1c440 72 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68 65  reeable.  If the
1c450 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74   returned result
1c460 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73 20   register.** is 
1c470 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
1c480 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73  or if the expres
1c490 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72  sion is a vector
1c4a0 20 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c 65   set *piFreeable
1c4b0 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61  .** to 0..*/.sta
1c4c0 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65  tic int exprCode
1c4d0 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50  Vector(Parse *pP
1c4e0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69  arse, Expr *p, i
1c4f0 6e 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29 7b  nt *piFreeable){
1c500 0a 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a  .  int iResult;.
1c510 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20    int nResult = 
1c520 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
1c530 72 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28 20  rSize(p);.  if( 
1c540 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20  nResult==1 ){.  
1c550 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69    iResult = sqli
1c560 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1c570 70 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72 65  pParse, p, piFre
1c580 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  eable);.  }else{
1c590 0a 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c 65  .    *piFreeable
1c5a0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
1c5b0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
1c5c0 7b 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  {.      iResult 
1c5d0 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
1c5e0 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
1c5f0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  , 0, 0);.    }el
1c600 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
1c610 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d  .      iResult =
1c620 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
1c630 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
1c640 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a  Mem += nResult;.
1c650 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1c660 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a  <nResult; i++){.
1c670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c680 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1c690 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
1c6a0 2e 70 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c  .pExpr, i+iResul
1c6b0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1c6c0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
1c6d0 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Result;.}.../*.*
1c6e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1c6f0 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
1c700 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
1c710 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
1c720 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65  xpression.  Atte
1c730 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  mpt to store the
1c740 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
1c750 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a  ster "target"..*
1c760 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
1c770 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75  ister where resu
1c780 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  lts are stored..
1c790 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20  **.** With this 
1c7a0 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69  routine, there i
1c7b0 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74  s no guarantee t
1c7c0 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c  hat results will
1c7d0 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e  .** be stored in
1c7e0 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
1c7f0 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74  sult might be st
1c800 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68  ored in some oth
1c810 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  er.** register i
1c820 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65  f it is convenie
1c830 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68  nt to do so.  Th
1c840 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1c850 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b  on.** must check
1c860 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
1c870 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65   and move the re
1c880 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73  sults to the des
1c890 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72  ired.** register
1c8a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c8b0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50  ExprCodeTarget(P
1c8c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1c8d0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
1c8e0 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
1c8f0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1c900 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e  e;  /* The VM un
1c910 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1c920 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
1c930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c940 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65  /* The opcode be
1c950 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
1c960 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65  nt inReg = targe
1c970 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  t;       /* Resu
1c980 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lts stored in re
1c990 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a  gister inReg */.
1c9a0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1c9b0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
1c9c0 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
1c9d0 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
1c9e0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
1c9f0 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20   regFree2 = 0;  
1ca00 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
1ca10 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
1ca20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1ca30 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  er */.  int r1, 
1ca40 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r2;             
1ca50 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67    /* Various reg
1ca60 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f  ister numbers */
1ca70 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1ca80 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20   pParse->db; /* 
1ca90 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
1caa0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
1cab0 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20  r tempX;        
1cac0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
1cad0 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  ary expression n
1cae0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20  ode */.  int p5 
1caf0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1cb00 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
1cb10 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
1cb20 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29   );.  if( v==0 )
1cb30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1cb40 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1cb50 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
1cb60 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  turn 0;.  }..  i
1cb70 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
1cb80 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
1cb90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
1cba0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
1cbb0 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
1cbc0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
1cbd0 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
1cbe0 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
1cbf0 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1cc00 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
1cc10 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1cc20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
1cc30 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
1cc40 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
1cc50 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
1cc60 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
1cc70 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69   assert( pCol->i
1cc80 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Mem>0 );.       
1cc90 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69   inReg = pCol->i
1cca0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Mem;.        bre
1ccb0 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ak;.      }else 
1ccc0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
1ccd0 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
1cce0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ccf0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1cd00 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
1cd10 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c  >sortingIdxPTab,
1cd20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1cd40 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1cd50 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
1cd60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cd70 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68    }.      /* Oth
1cd80 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72  erwise, fall thr
1cd90 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f  u into the TK_CO
1cda0 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20  LUMN case */.   
1cdb0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
1cdc0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
1cdd0 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d  nt iTab = pExpr-
1cde0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69  >iTable;.      i
1cdf0 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20  f( iTab<0 ){.   
1ce00 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
1ce10 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20  >ckBase>0 ){.   
1ce20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
1ce30 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74  ting CHECK const
1ce40 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74  raints or insert
1ce50 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c  ing into partial
1ce60 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
1ce70 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
1ce80 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61  r->iColumn + pPa
1ce90 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20  rse->ckBase;.   
1cea0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1ceb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cec0 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67         /* Coding
1ced0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
1cee0 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
1cef0 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f  n index where co
1cf00 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20  lumn names.     
1cf10 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
1cf20 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20 74 68  ndex refer to th
1cf30 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68  e table to which
1cf40 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
1cf50 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  gs */.          
1cf60 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69  iTab = pParse->i
1cf70 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20 20  SelfTab;.       
1cf80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1cf90 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1cfa0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1cfb0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  n(pParse, pExpr-
1cfc0 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  >pTab,.         
1cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfe0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
1cff0 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67  lumn, iTab, targ
1d000 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d020 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a     pExpr->op2);.
1d030 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d040 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1d050 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
1d060 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
1d070 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61  se, pExpr, 0, ta
1d080 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
1d090 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1d0a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1d0b0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1d0c0 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
1d0d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1d0e0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1d0f0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1d100 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f  lue) );.      co
1d110 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d  deReal(v, pExpr-
1d120 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61  >u.zToken, 0, ta
1d130 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
1d140 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1d150 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
1d160 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ING: {.      ass
1d170 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1d180 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1d190 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1d1a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1d1b0 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67  adString(v, targ
1d1c0 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  et, pExpr->u.zTo
1d1d0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
1d1e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1d1f0 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
1d200 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d210 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1d220 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1d230 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d240 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d250 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
1d260 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
1d270 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
1d280 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
1d290 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61  ar *z;.      cha
1d2a0 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20  r *zBlob;.      
1d2b0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1d2c0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1d2d0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1d2e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1d2f0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
1d300 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e  =='x' || pExpr->
1d310 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27  u.zToken[0]=='X'
1d320 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1d330 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1d340 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  n[1]=='\'' );.  
1d350 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e      z = &pExpr->
1d360 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20  u.zToken[2];.   
1d370 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
1d380 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20  rlen30(z) - 1;. 
1d390 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e       assert( z[n
1d3a0 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
1d3b0 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   zBlob = sqlite3
1d3c0 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65  HexToBlob(sqlite
1d3d0 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e  3VdbeDb(v), z, n
1d3e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d3f0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1d400 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67  _Blob, n/2, targ
1d410 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34  et, 0, zBlob, P4
1d420 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
1d430 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1d440 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
1d450 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
1d460 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1d470 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1d480 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1d490 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d4a0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1d4b0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1d4c0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1d4d0 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  oken[0]!=0 );.  
1d4e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d4f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69  ddOp2(v, OP_Vari
1d500 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f  able, pExpr->iCo
1d510 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
1d520 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1d530 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29  u.zToken[1]!=0 )
1d540 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1d550 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1d560 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20 20  n[0]=='?' .     
1d570 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d          || strcm
1d580 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
1d590 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  n, pParse->azVar
1d5a0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  [pExpr->iColumn-
1d5b0 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  1])==0 );.      
1d5c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1d5d0 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50 61  ngeP4(v, -1, pPa
1d5e0 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72  rse->azVar[pExpr
1d5f0 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34  ->iColumn-1], P4
1d600 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
1d610 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1d620 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1d630 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
1d640 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
1d650 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
1d660 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1d670 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d680 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
1d690 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
1d6a0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
1d6b0 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
1d6c0 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
1d6d0 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65  n) */.      inRe
1d6e0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1d6f0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1d700 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1d710 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
1d720 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
1d730 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1d740 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d750 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
1d760 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1d770 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
1d780 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1d790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d7a0 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74  p2(v, OP_Cast, t
1d7b0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1d7d0 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
1d7e0 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
1d7f0 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74  en, 0));.      t
1d800 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43  estcase( usedAsC
1d810 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
1d820 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29  e, inReg, inReg)
1d830 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1d840 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1d850 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1d860 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20   inReg, 1);.    
1d870 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1d880 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1d890 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
1d8a0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1d8b0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
1d8c0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
1d8d0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
1d8e0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35   TK_NE;.      p5
1d8f0 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
1d900 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d  ;.      /* fall-
1d910 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63  through */.    c
1d920 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
1d930 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
1d940 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
1d950 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
1d960 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
1d970 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
1d980 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
1d990 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1d9a0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1d9b0 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65  ExprIsVector(pLe
1d9c0 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ft) ){.        c
1d9d0 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65  odeVectorCompare
1d9e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1d9f0 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b  target, op, p5);
1da00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1da10 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1da20 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1da30 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72  Parse, pLeft, &r
1da40 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1da50 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1da60 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1da70 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1da80 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1da90 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1daa0 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
1dab0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1dac0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1dad0 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
1dae0 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20  QLITE_STOREP2 | 
1daf0 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  p5);.        ass
1db00 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
1db10 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1db20 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
1db30 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1db40 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Lt);.        ass
1db50 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
1db60 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1db70 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
1db80 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1db90 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Le);.        ass
1dba0 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
1dbb0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1dbc0 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
1dbd0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1dbe0 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Gt);.        ass
1dbf0 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
1dc00 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1dc10 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
1dc20 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1dc30 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Ge);.        ass
1dc40 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
1dc50 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1dc60 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65  OP_Eq); VdbeCove
1dc70 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1dc80 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Eq);.        ass
1dc90 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
1dca0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1dcb0 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ne); VdbeCove
1dcc0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1dcd0 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  Ne);.        tes
1dce0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1dcf0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
1dd00 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1dd10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
1dd20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1dd30 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  }.    case TK_AN
1dd40 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  D:.    case TK_O
1dd50 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  R:.    case TK_P
1dd60 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LUS:.    case TK
1dd70 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20  _STAR:.    case 
1dd80 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61  TK_MINUS:.    ca
1dd90 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63  se TK_REM:.    c
1dda0 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20  ase TK_BITAND:. 
1ddb0 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
1ddc0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  :.    case TK_SL
1ddd0 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ASH:.    case TK
1dde0 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73  _LSHIFT:.    cas
1ddf0 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20  e TK_RSHIFT: .  
1de00 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
1de10 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1de20 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64  ( TK_AND==OP_And
1de30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74   );            t
1de40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1de50 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
1de60 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f  ert( TK_OR==OP_O
1de70 72 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  r );            
1de80 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1de90 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  TK_OR );.      a
1dea0 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
1deb0 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20  OP_Add );       
1dec0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ded0 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20  ==TK_PLUS );.   
1dee0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49     assert( TK_MI
1def0 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74  NUS==OP_Subtract
1df00 20 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65   );     testcase
1df10 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29  ( op==TK_MINUS )
1df20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1df30 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69  TK_REM==OP_Remai
1df40 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73  nder );      tes
1df50 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45  tcase( op==TK_RE
1df60 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
1df70 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50  t( TK_BITAND==OP
1df80 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20  _BitAnd );      
1df90 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1dfa0 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20  _BITAND );.     
1dfb0 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f   assert( TK_BITO
1dfc0 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20  R==OP_BitOr );  
1dfd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dfe0 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a  op==TK_BITOR );.
1dff0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e000 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
1e010 65 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63  e );       testc
1e020 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53  ase( op==TK_SLAS
1e030 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  H );.      asser
1e040 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
1e050 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20  _ShiftLeft );   
1e060 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1e070 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _LSHIFT );.     
1e080 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49   assert( TK_RSHI
1e090 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  FT==OP_ShiftRigh
1e0a0 74 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  t );  testcase( 
1e0b0 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b  op==TK_RSHIFT );
1e0c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e0d0 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e  K_CONCAT==OP_Con
1e0e0 63 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74  cat );      test
1e0f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e  case( op==TK_CON
1e100 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  CAT );.      r1 
1e110 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e120 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1e130 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1e140 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1e150 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e160 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e170 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1e180 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1e190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e1a0 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c  3(v, op, r2, r1,
1e1b0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e1c0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1e1d0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1e1e0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1e1f0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1e200 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e210 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
1e220 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
1e230 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
1e240 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1e250 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20   pLeft );.      
1e260 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
1e270 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
1e280 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
1e290 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1e2a0 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e  1, target);.#ifn
1e2b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e2c0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1e2d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1e2e0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
1e2f0 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  AT ){.        as
1e300 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1e310 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e320 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1e330 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1e340 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  , pLeft->u.zToke
1e350 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23  n, 1, target);.#
1e360 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
1e370 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  e{.        tempX
1e380 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52  .op = TK_INTEGER
1e390 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
1e3a0 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61  flags = EP_IntVa
1e3b0 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  lue|EP_TokenOnly
1e3c0 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
1e3d0 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  u.iValue = 0;.  
1e3e0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1e3f0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e400 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
1e410 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1e420 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1e430 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e440 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e450 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1e460 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e470 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
1e480 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20  btract, r2, r1, 
1e490 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1e4a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1e4b0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1e4c0 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  }.      inReg = 
1e4d0 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72  target;.      br
1e4e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e4f0 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
1e500 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
1e510 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e520 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69  TK_BITNOT==OP_Bi
1e530 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61  tNot );   testca
1e540 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f  se( op==TK_BITNO
1e550 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
1e560 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f  t( TK_NOT==OP_No
1e570 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73  t );         tes
1e580 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1e590 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1e5a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e5b0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1e5c0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1e5d0 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
1e5e0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1e5f0 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  0 );.      inReg
1e600 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
1e610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e620 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e  p2(v, op, r1, in
1e630 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
1e640 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1e650 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
1e660 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
1e670 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
1e680 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
1e690 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
1e6a0 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74  IsNull );   test
1e6b0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1e6c0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ULL );.      ass
1e6d0 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
1e6e0 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74  =OP_NotNull ); t
1e6f0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e700 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
1e710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e720 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1e730 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
1e740 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1e750 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e760 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1e770 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1e780 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e790 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1e7a0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
1e7b0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1e7c0 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56  op, r1);.      V
1e7d0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1e7e0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
1e7f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1e800 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1e810 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
1e820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e830 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1e840 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1e850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1e860 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
1e870 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e880 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e890 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
1e8a0 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
1e8b0 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
1e8c0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  ggInfo;.      if
1e8d0 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  ( pInfo==0 ){.  
1e8e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1e8f0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1e900 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1e910 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e) );.        sq
1e920 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1e930 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
1e940 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29   aggregate: %s()
1e950 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
1e960 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
1e970 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  {.        inReg 
1e980 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70  = pInfo->aFunc[p
1e990 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d  Expr->iAgg].iMem
1e9a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e9b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e9c0 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
1e9d0 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
1e9e0 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20  ist *pFarg;     
1e9f0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e    /* List of fun
1ea00 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1ea10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61  */.      int nFa
1ea20 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
1ea30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e  /* Number of fun
1ea40 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1ea50 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  */.      FuncDef
1ea60 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20   *pDef;         
1ea70 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
1ea80 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63  definition objec
1ea90 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  t */.      const
1eaa0 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
1eab0 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
1eac0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
1ead0 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  u32 constMask = 
1eae0 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  0;     /* Mask o
1eaf0 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
1eb00 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f  ents that are co
1eb10 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20  nstant */.      
1eb20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1eb30 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1eb40 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
1eb50 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
1eb60 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65  ;      /* The te
1eb70 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
1eb80 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
1eb90 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53  e */.      CollS
1eba0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20  eq *pColl = 0;  
1ebb0 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67    /* A collating
1ebc0 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20   sequence */..  
1ebd0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1ebe0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1ebf0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1ec00 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  ) );.      if( E
1ec10 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ec20 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
1ec30 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ly) ){.        p
1ec40 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Farg = 0;.      
1ec50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1ec60 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Farg = pExpr->x.
1ec70 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
1ec80 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61       nFarg = pFa
1ec90 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70  rg ? pFarg->nExp
1eca0 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73  r : 0;.      ass
1ecb0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1ecc0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1ecd0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1ece0 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
1ecf0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
1ed00 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
1ed10 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
1ed20 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  Id, nFarg, enc, 
1ed30 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0);.#ifdef SQLIT
1ed40 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e  E_ENABLE_UNKNOWN
1ed50 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20  _SQL_FUNCTION.  
1ed60 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
1ed70 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  && pParse->expla
1ed80 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  in ){.        pD
1ed90 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
1eda0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e  Function(db, "un
1edb0 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65  known", nFarg, e
1edc0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nc, 0);.      }.
1edd0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
1ede0 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66   pDef==0 || pDef
1edf0 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29  ->xFinalize!=0 )
1ee00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ee10 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ee20 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74  , "unknown funct
1ee30 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29  ion: %s()", zId)
1ee40 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1ee50 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1ee60 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72  /* Attempt a dir
1ee70 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ect implementati
1ee80 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d  on of the built-
1ee90 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e  in COALESCE() an
1eea0 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c  d.      ** IFNUL
1eeb0 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  L() functions.  
1eec0 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65  This avoids unne
1eed0 63 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69  cessary evaluati
1eee0 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  on of.      ** a
1eef0 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68  rguments past th
1ef00 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c  e first non-NULL
1ef10 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
1ef20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
1ef30 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1ef40 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c  SQLITE_FUNC_COAL
1ef50 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ESCE ){.        
1ef60 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20  int endCoalesce 
1ef70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1ef80 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1ef90 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
1efa0 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  >=2 );.        s
1efb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1efc0 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
1efd0 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
1efe0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
1eff0 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =1; i<nFarg; i++
1f000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1f010 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f020 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61  , OP_NotNull, ta
1f030 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63  rget, endCoalesc
1f040 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  e);.          Vd
1f050 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1f060 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f070 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1f080 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20  pParse, target, 
1f090 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
1f0a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1f0b0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1f0c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f0d0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
1f0e0 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  arg->a[i].pExpr,
1f0f0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1f100 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f110 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1f120 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1f140 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
1f150 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
1f160 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1f170 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   }..      /* The
1f180 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63   UNLIKELY() func
1f190 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1f1a0 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20    The result is 
1f1b0 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
1f1c0 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
1f1d0 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
1f1e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
1f1f0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
1f200 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b  QLITE_FUNC_UNLIK
1f210 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ELY ){.        a
1f220 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20  ssert( nFarg>=1 
1f230 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1f240 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f250 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1f260 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1f270 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
1f280 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f290 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
1f2a0 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =0; i<nFarg; i++
1f2b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1f2c0 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78  <32 && sqlite3Ex
1f2d0 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61  prIsConstant(pFa
1f2e0 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  rg->a[i].pExpr) 
1f2f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
1f300 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a  tcase( i==31 );.
1f310 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
1f320 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32  ask |= MASKBIT32
1f330 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
1f340 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
1f350 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
1f360 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
1f370 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c  LL)!=0 && !pColl
1f380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
1f390 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
1f3a0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
1f3b0 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
1f3c0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
1f3d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f3e0 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20   pFarg ){.      
1f3f0 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20    if( constMask 
1f400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  ){.          r1 
1f410 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
1f420 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
1f430 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72  se->nMem += nFar
1f440 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  g;.        }else
1f450 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  {.          r1 =
1f460 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1f470 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61  ange(pParse, nFa
1f480 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  rg);.        }..
1f490 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1f4a0 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65  ength() and type
1f4b0 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77  of() functions w
1f4c0 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67  ith a column arg
1f4d0 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a  ument,.        *
1f4e0 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72  * set the P5 par
1f4f0 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50  ameter to the OP
1f500 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74  _Column opcode t
1f510 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  o OPFLAG_LENGTHA
1f520 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  RG.        ** or
1f530 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
1f540 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  G respectively, 
1f550 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
1f560 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20  sary data.      
1f570 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20    ** loading..  
1f580 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1f590 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
1f5a0 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
1f5b0 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49  FUNC_LENGTH|SQLI
1f5c0 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29  TE_FUNC_TYPEOF))
1f5d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1f5e0 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20   u8 exprOp;.    
1f5f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
1f600 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg==1 );.      
1f610 20 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72      assert( pFar
1f620 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  g->a[0].pExpr!=0
1f630 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78   );.          ex
1f640 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b  prOp = pFarg->a[
1f650 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20  0].pExpr->op;.  
1f660 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72          if( expr
1f670 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  Op==TK_COLUMN ||
1f680 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f   exprOp==TK_AGG_
1f690 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
1f6a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
1f6b0 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
1f6c0 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  ==OPFLAG_LENGTHA
1f6d0 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
1f6e0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
1f6f0 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50  _FUNC_TYPEOF==OP
1f700 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29  FLAG_TYPEOFARG )
1f710 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
1f720 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75  stcase( pDef->fu
1f730 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47  ncFlags & OPFLAG
1f740 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
1f750 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d            pFarg-
1f760 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32  >a[0].pExpr->op2
1f770 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
1f780 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63        pDef->func
1f790 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f  Flags & (OPFLAG_
1f7a0 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47  LENGTHARG|OPFLAG
1f7b0 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20  _TYPEOFARG);.   
1f7c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f7d0 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69   }..        sqli
1f7e0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1f7f0 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
1f800 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
1f810 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  34be */.        
1f820 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
1f830 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1f840 70 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20  pFarg, r1, 0,.  
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1f870 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51  LITE_ECEL_DUP|SQ
1f880 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
1f890 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f8a0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1f8b0 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20  Parse);      /* 
1f8c0 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33  Ticket 2ea2425d3
1f8d0 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  4be */.      }el
1f8e0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
1f8f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
1f900 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f910 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
1f920 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f     /* Possibly o
1f930 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63  verload the func
1f940 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73  tion if the firs
1f950 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20  t argument is.  
1f960 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c      ** a virtual
1f970 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20   table column.. 
1f980 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1f990 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74   For infix funct
1f9a0 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42  ions (LIKE, GLOB
1f9b0 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41  , REGEXP, and MA
1f9c0 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20  TCH) use the.   
1f9d0 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67     ** second arg
1f9e0 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66  ument, not the f
1f9f0 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67  irst, as the arg
1fa00 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f  ument to test to
1fa10 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66  .      ** see if
1fa20 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20   it is a column 
1fa30 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
1fa40 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e  le.  This is don
1fa50 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20  e because.      
1fa60 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  ** the left oper
1fa70 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e  and of infix fun
1fa80 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72  ctions (the oper
1fa90 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20  and we want to. 
1faa0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20       ** control 
1fab0 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64  overloading) end
1fac0 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f  s up as the seco
1fad0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
1fae0 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  he.      ** func
1faf0 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65  tion.  The expre
1fb00 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22  ssion "A glob B"
1fb10 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1fb20 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f  o .      ** "glo
1fb30 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74  b(B,A).  We want
1fb40 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e   to use the A in
1fb50 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74   "A glob B" to t
1fb60 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  est.      ** for
1fb70 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f   function overlo
1fb80 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75  ading.  But we u
1fb90 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e  se the B term in
1fba0 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20   "glob(B,A)"..  
1fbb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1fbc0 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45   nFarg>=2 && (pE
1fbd0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
1fbe0 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20  InfixFunc) ){.  
1fbf0 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
1fc00 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
1fc10 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
1fc20 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
1fc30 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
1fc40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
1fc50 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  arg>0 ){.       
1fc60 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
1fc70 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
1fc80 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46  ion(db, pDef, nF
1fc90 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  arg, pFarg->a[0]
1fca0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
1fcb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
1fcc0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
1fcd0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
1fce0 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
1fcf0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1fd00 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
1fd10 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20  ltColl; .       
1fd20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fd30 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
1fd40 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
1fd50 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
1fd60 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LSEQ);.      }. 
1fd70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fd80 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e  AddOp4(v, OP_Fun
1fd90 63 74 69 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61 73  ction0, constMas
1fda0 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20  k, r1, target,. 
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 44         (char*)pD
1fdd0 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
1fde0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1fdf0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
1fe00 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  8)nFarg);.      
1fe10 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e  if( nFarg && con
1fe20 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20  stMask==0 ){.   
1fe30 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
1fe40 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
1fe50 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
1fe60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1fe70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1fe80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1fe90 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
1fea0 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
1feb0 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
1fec0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f   {.      int nCo
1fed0 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  l;.      testcas
1fee0 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  e( op==TK_EXISTS
1fef0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1ff00 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  se( op==TK_SELEC
1ff10 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  T );.      if( o
1ff20 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p==TK_SELECT && 
1ff30 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78  (nCol = pExpr->x
1ff40 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
1ff50 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20  ->nExpr)!=1 ){. 
1ff60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75         sqlite3Su
1ff70 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  bselectError(pPa
1ff80 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20  rse, nCol, 1);. 
1ff90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ffa0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1ffb0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
1ffc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1ffd0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
1ffe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fff0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  }.    case TK_SE
20000 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  LECT_COLUMN: {. 
20010 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
20020 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30  pLeft->iTable==0
20030 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
20040 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65  r->pLeft->iTable
20050 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
20060 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
20070 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 2c  pExpr->pLeft, 0,
20080 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
20090 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
200a0 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20  ->pLeft->iTable 
200b0 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
200c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
200d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
200e0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
200f0 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
20100 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
20110 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
20120 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
20130 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
20140 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
20150 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20160 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
20170 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
20180 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
20190 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
201a0 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
201b0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
201c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
201d0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
201e0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
201f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
20200 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
20210 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
20220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20230 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
20240 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20   target, 0);.   
20250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
20260 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
20270 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
20280 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
20290 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
202a0 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
202b0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
202c0 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
202d0 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
202e0 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
202f0 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
20300 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
20310 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
20320 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
20330 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
20340 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
20350 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
20360 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
20370 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
20380 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
20390 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
203a0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
203b0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
203c0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
203d0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
203e0 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c  Expr, target, 0,
203f0 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
20400 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20410 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61   TK_SPAN:.    ca
20420 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a  se TK_COLLATE: .
20430 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
20440 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  S: {.      inReg
20450 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
20460 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
20470 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
20480 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
20490 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
204a0 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a  case TK_TRIGGER:
204b0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
204c0 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f  he opcode is TK_
204d0 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68  TRIGGER, then th
204e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
204f0 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  a reference.    
20500 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e    ** to a column
20510 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72   in the new.* or
20520 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
20530 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74  bles available t
20540 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67  o.      ** trigg
20550 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20  er programs. In 
20560 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69  this case Expr.i
20570 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
20580 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20  1 for the.      
20590 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  ** new.* pseudo-
205a0 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20  table, or 0 for 
205b0 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
205c0 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f  -table. Expr.iCo
205d0 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  lumn.      ** is
205e0 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   set to the colu
205f0 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f  mn of the pseudo
20600 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20  -table to read, 
20610 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20  or to -1 to.    
20620 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f    ** read the ro
20630 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20  wid field..     
20640 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
20650 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69   expression is i
20660 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
20670 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63   an OP_Param opc
20680 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20  ode. The p1.    
20690 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69    ** parameter i
206a0 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61  s set to 0 for a
206b0 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65  n old.rowid refe
206c0 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b  rence, or to (i+
206d0 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  1).      ** to r
206e0 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72  eference another
206f0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f   column of the o
20700 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
20710 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20  e, where .      
20720 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65  ** i is the inde
20730 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  x of the column.
20740 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64   For a new.rowid
20750 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69   reference, p1 i
20760 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74  s.      ** set t
20770 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e  o (n+1), where n
20780 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
20790 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63  f columns in eac
207a0 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  h pseudo-table..
207b0 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72        ** For a r
207c0 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
207d0 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20  other column in 
207e0 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f  the new.* pseudo
207f0 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20  -table, p1.     
20800 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e   ** is set to (n
20810 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61  +2+i), where n a
20820 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69  nd i are as defi
20830 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20  ned previously. 
20840 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61  For.      ** exa
20850 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62  mple, if the tab
20860 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67  le on which trig
20870 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66  gers are being f
20880 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a  ired is.      **
20890 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20   declared as:.  
208a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
208b0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
208c0 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a  1(a, b);.      *
208d0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  *.      ** Then 
208e0 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  p1 is interprete
208f0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
20900 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
20910 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20    p1==0   ->    
20920 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31  old.rowid     p1
20930 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==3   ->    new.
20940 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20  rowid.      **  
20950 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f   p1==1   ->    o
20960 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d  ld.a         p1=
20970 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61  =4   ->    new.a
20980 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
20990 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20  2   ->    old.b 
209a0 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20          p1==5   
209b0 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20  ->    new.b     
209c0 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
209d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
209e0 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
209f0 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70     int p1 = pExp
20a00 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61  r->iTable * (pTa
20a10 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b  b->nCol+1) + 1 +
20a20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
20a30 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
20a40 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
20a50 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
20a60 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73  e==1 );.      as
20a70 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
20a80 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70  lumn>=-1 && pExp
20a90 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d  r->iColumn<pTab-
20aa0 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61  >nCol );.      a
20ab0 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b  ssert( pTab->iPK
20ac0 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  ey<0 || pExpr->i
20ad0 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50  Column!=pTab->iP
20ae0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Key );.      ass
20af0 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31  ert( p1>=0 && p1
20b00 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32  <(pTab->nCol*2+2
20b10 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ) );..      sqli
20b20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20b30 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74   OP_Param, p1, t
20b40 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64  arget);.      Vd
20b50 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
20b60 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20  s.%s -> $%d",.  
20b70 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54        (pExpr->iT
20b80 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22  able ? "new" : "
20b90 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28  old"),.        (
20ba0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
20bb0 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78   ? "rowid" : pEx
20bc0 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  pr->pTab->aCol[p
20bd0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a  Expr->iColumn].z
20be0 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74  Name),.        t
20bf0 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a  arget.      ));.
20c00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20c10 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
20c20 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  INT.      /* If 
20c30 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52  the column has R
20c40 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74  EAL affinity, it
20c50 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62   may currently b
20c60 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20  e stored as an. 
20c70 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e       ** integer.
20c80 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69   Use OP_RealAffi
20c90 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72  nity to make sur
20ca0 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  e it is really r
20cb0 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eal..      **.  
20cc0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
20cd0 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36  OF: R-60985-5766
20ce0 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f  2 SQLite will co
20cf0 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20  nvert the value 
20d00 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a  back to.      **
20d10 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
20d20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20  when extracting 
20d30 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f  it from the reco
20d40 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  rd.  */.      if
20d50 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
20d60 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  >=0 .       && p
20d70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
20d80 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  >iColumn].affini
20d90 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
20da0 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  EAL.      ){.   
20db0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20dc0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61  AddOp1(v, OP_Rea
20dd0 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65  lAffinity, targe
20de0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
20df0 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
20e00 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
20e10 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20  TK_VECTOR: {.   
20e20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20e30 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20  sg(pParse, "row 
20e40 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b  value misused");
20e50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20e60 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
20e70 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a  ** Form A:.    *
20e80 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20  *   CASE x WHEN 
20e90 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
20ea0 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
20eb0 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
20ec0 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
20ed0 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a  .    ** Form B:.
20ee0 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
20ef0 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48  EN e1 THEN r1 WH
20f00 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e  EN e2 THEN r2 ..
20f10 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72  . WHEN eN THEN r
20f20 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
20f30 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   **.    ** Form 
20f40 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e  A is can be tran
20f50 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65  sformed into the
20f60 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d   equivalent form
20f70 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20   B as follows:. 
20f80 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
20f90 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57  N x=e1 THEN r1 W
20fa0 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32  HEN x=e2 THEN r2
20fb0 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20   ....    **     
20fc0 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45     WHEN x=eN THE
20fd0 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
20fe0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
20ff0 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
21000 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  s in pExpr->pLef
21010 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69  t..    ** Y is i
21020 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  n the last eleme
21030 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70  nt of pExpr->x.p
21040 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78  List if pExpr->x
21050 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73  .pList->nExpr is
21060 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68  .    ** odd.  Th
21070 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69  e Y is also opti
21080 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75  onal.  If the nu
21090 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
210a0 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20   in x.pList.    
210b0 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e  ** is even, then
210c0 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e   Y is omitted an
210d0 64 20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65  d the "otherwise
210e0 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  " result is NULL
210f0 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69  ..    ** Ei is i
21100 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
21110 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73  a[i*2] and Ri is
21120 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
21130 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a  [i*2+1]..    **.
21140 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c      ** The resul
21150 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  t of the express
21160 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f  ion is the Ri fo
21170 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
21180 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20  hing Ei,.    ** 
21190 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  or if there is n
211a0 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74  o matching Ei, t
211b0 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20  he ELSE term Y, 
211c0 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  or if there is. 
211d0 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65     ** no ELSE te
211e0 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f  rm, NULL..    */
211f0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
21200 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53  sert( op==TK_CAS
21210 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74  E ); {.      int
21220 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20   endLabel;      
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21240 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
21250 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d   end of CASE stm
21260 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
21270 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20  extCase;        
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21290 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e  GOTO label for n
212a0 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20  ext WHEN clause 
212b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  */.      int nEx
212c0 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
212d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78             /* 2x
212e0 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20   number of WHEN 
212f0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69  terms */.      i
21300 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21320 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21330 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
21340 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
21350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
21360 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ist of WHEN term
21370 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  s */.      struc
21380 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
21390 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20  *aListelem;  /* 
213a0 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65  Array of WHEN te
213b0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  rms */.      Exp
213c0 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20  r opCompare;    
213d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
213e0 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72  * The X==Ei expr
213f0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
21400 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21420 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65    /* The X expre
21430 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
21440 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20  xpr *pTest = 0; 
21450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21460 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20   /* X==Ei (form 
21470 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66  A) or just Ei (f
21480 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20  orm B) */.      
21490 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43  VVA_ONLY( int iC
214a0 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72  acheLevel = pPar
214b0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
214c0 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   )..      assert
214d0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
214e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
214f0 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72  Select) && pExpr
21500 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20  ->x.pList );.   
21510 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
21520 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
21530 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69  > 0);.      pELi
21540 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
21550 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74  ist;.      aList
21560 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61  elem = pEList->a
21570 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
21580 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
21590 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20       endLabel = 
215a0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
215b0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
215c0 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e  f( (pX = pExpr->
215d0 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
215e0 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58       tempX = *pX
215f0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
21600 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43  se( pX->op==TK_C
21610 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
21620 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
21630 26 74 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65  &tempX, exprCode
21640 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26  Vector(pParse, &
21650 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31  tempX, &regFree1
21660 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ));.        test
21670 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
21680 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 );.        mem
21690 73 65 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20  set(&opCompare, 
216a0 30 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70  0, sizeof(opComp
216b0 61 72 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f  are));.        o
216c0 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b  pCompare.op = TK
216d0 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  _EQ;.        opC
216e0 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26  ompare.pLeft = &
216f0 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70  tempX;.        p
21700 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72  Test = &opCompar
21710 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69  e;.        /* Ti
21720 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63 64  cket b351d95f9cd
21730 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38 66  5ef17e9d9dbae18f
21740 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20  5ca8611190001:. 
21750 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61         ** The va
21760 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31 20  lue in regFree1 
21770 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d  might get SCopy-
21780 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  ed into the file
21790 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20   result..       
217a0 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65   ** So make sure
217b0 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72 65   that the regFre
217c0 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  e1 register is n
217d0 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74  ot reused for ot
217e0 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  her.        ** p
217f0 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73  urposes and poss
21800 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e  ibly overwritten
21810 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  .  */.        re
21820 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20  gFree1 = 0;.    
21830 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
21840 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d  0; i<nExpr-1; i=
21850 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i+2){.        sq
21860 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
21870 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
21880 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
21890 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
218a0 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
218b0 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
218c0 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
218d0 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
218e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
218f0 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
21900 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
21910 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21920 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
21930 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
21940 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
21950 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d  testcase( pTest-
21960 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
21970 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21980 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
21990 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74  rse, pTest, next
219a0 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Case, SQLITE_JUM
219b0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
219c0 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73    testcase( aLis
219d0 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
219e0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
219f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21a00 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
21a10 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e, aListelem[i+1
21a20 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
21a30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21a40 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64  3VdbeGoto(v, end
21a50 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Label);.        
21a60 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
21a70 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
21a80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21a90 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
21aa0 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
21ab0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45   }.      if( (nE
21ac0 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  xpr&1)!=0 ){.   
21ad0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21ae0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
21af0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21b00 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
21b10 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78  e, pEList->a[nEx
21b20 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  pr-1].pExpr, tar
21b30 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
21b40 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
21b50 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
21b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21b70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21b80 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
21b90 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21ba0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
21bb0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
21bc0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
21bd0 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  >0 .           |
21be0 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  | pParse->iCache
21bf0 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76  Level==iCacheLev
21c00 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  el );.      sqli
21c10 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
21c20 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  bel(v, endLabel)
21c30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
21c40 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
21c50 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
21c60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
21c70 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  SE: {.      asse
21c80 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  rt( pExpr->affin
21c90 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  ity==OE_Rollback
21ca0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
21cb0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
21cc0 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20  =OE_Abort.      
21cd0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
21ce0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c  ffinity==OE_Fail
21cf0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
21d00 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
21d10 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20  OE_Ignore.      
21d20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
21d30 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
21d40 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
21d50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
21d60 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
21d70 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49              "RAI
21d80 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  SE() may only be
21d90 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74   used within a t
21da0 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29  rigger-program")
21db0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21dc0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
21dd0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
21de0 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20  inity==OE_Abort 
21df0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21e00 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
21e10 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
21e20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
21e30 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
21e40 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
21e50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
21e60 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
21e70 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
21e80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21e90 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20  Op4(.           
21ea0 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c   v, OP_Halt, SQL
21eb0 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72  ITE_OK, OE_Ignor
21ec0 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  e, 0, pExpr->u.z
21ed0 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20  Token,0);.      
21ee0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
21ef0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
21f00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
21f10 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
21f20 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  arse, SQLITE_CON
21f30 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c  STRAINT_TRIGGER,
21f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21f60 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20  Expr->affinity, 
21f70 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
21f80 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
21f90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
21fa0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
21fb0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
21fc0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
21fd0 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
21fe0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
21ff0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
22000 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  e2);.  return in
22010 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61  Reg;.}../*.** Fa
22020 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64  ctor out the cod
22030 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  e of the given e
22040 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69  xpression to ini
22050 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
22060 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22070 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
22080 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
22090 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
220a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
220b0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
220c0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
220d0 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68   to code when th
220e0 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a  e VDBE initializ
220f0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  es */.  int regD
22100 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f  est,      /* Sto
22110 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
22120 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
22130 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65 20 20  .  u8 reusable  
22140 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22150 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
22160 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29  is reusable */.)
22170 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b  {.  ExprList *p;
22180 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74  .  assert( Const
22190 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
221a0 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65   );.  p = pParse
221b0 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  ->pConstExpr;.  
221c0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
221d0 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
221e0 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
221f0 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  p = sqlite3ExprL
22200 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
22210 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69  , p, pExpr);.  i
22220 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72  f( p ){.     str
22230 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
22240 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  m *pItem = &p->a
22250 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  [p->nExpr-1];.  
22260 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e     pItem->u.iCon
22270 73 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44  stExprReg = regD
22280 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  est;.     pItem-
22290 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 75 73  >reusable = reus
222a0 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72  able;.  }.  pPar
222b0 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d  se->pConstExpr =
222c0 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   p;.}../*.** Gen
222d0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
222e0 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
222f0 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  sion and store t
22300 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
22310 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  to a register.  
22320 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
22330 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ter number where
22340 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
22350 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
22360 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65  * If the registe
22370 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
22380 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
22390 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65  an be deallocate
223a0 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  d,.** then write
223b0 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f   its number into
223c0 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20   *pReg.  If the 
223d0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
223e0 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70  is not.** a temp
223f0 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20  orary, then set 
22400 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pReg to zero..*
22410 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
22420 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65   a constant, the
22430 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
22440 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68  ight generate th
22450 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69  is.** code to fi
22460 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ll the register 
22470 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  in the initializ
22480 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66  ation section of
22490 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
224a0 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74  gram, in order t
224b0 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20  o factor it out 
224c0 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  of the evaluatio
224d0 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73  n loop..*/.int s
224e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
224f0 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mp(Parse *pParse
22500 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
22510 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74  nt *pReg){.  int
22520 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   r2;.  pExpr = s
22530 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
22540 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
22550 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  if( ConstFactorO
22560 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20  k(pParse).   && 
22570 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
22580 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c  GISTER.   && sql
22590 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
225a0 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29  ntNotJoin(pExpr)
225b0 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  .  ){.    ExprLi
225c0 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  st *p = pParse->
225d0 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20  pConstExpr;.    
225e0 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52 65 67  int i;.    *pReg
225f0 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70    = 0;.    if( p
22600 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
22610 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
22620 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
22630 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70  (pItem=p->a, i=p
22640 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49  ->nExpr; i>0; pI
22650 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20  tem++, i--){.   
22660 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
22670 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69  reusable && sqli
22680 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
22690 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70  Item->pExpr,pExp
226a0 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r,-1)==0 ){.    
226b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74        return pIt
226c0 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72  em->u.iConstExpr
226d0 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Reg;.        }. 
226e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
226f0 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e   r2 = ++pParse->
22700 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
22710 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
22720 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
22730 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2, 1);.  }else{.
22740 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
22750 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
22760 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d  Parse);.    r2 =
22770 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22780 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
22790 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69  Expr, r1);.    i
227a0 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20  f( r2==r1 ){.   
227b0 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20     *pReg = r1;. 
227c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
227d0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
227e0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
227f0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  );.      *pReg =
22800 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
22810 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a  return r2;.}../*
22820 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
22830 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
22840 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
22850 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
22860 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
22870 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
22880 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
22890 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
228a0 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
228b0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
228c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
228d0 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
228e0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
228f0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
22900 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20  .  int inReg;.. 
22910 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
22920 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
22930 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
22940 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70  f( pExpr && pExp
22950 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
22960 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ER ){.    sqlite
22970 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
22980 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f  se->pVdbe, OP_Co
22990 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  py, pExpr->iTabl
229a0 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65  e, target);.  }e
229b0 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d  lse{.    inReg =
229c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
229d0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
229e0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
229f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
22a00 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70  e->pVdbe!=0 || p
22a10 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
22a20 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
22a30 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
22a40 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62   && pParse->pVdb
22a50 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
22a60 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
22a70 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
22a80 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
22a90 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  get);.    }.  }.
22aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
22ab0 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f  transient copy o
22ac0 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
22ad0 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65  pr and then code
22ae0 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c   it using.** sql
22af0 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20  ite3ExprCode(). 
22b00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
22b10 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71  rks just like sq
22b20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a  lite3ExprCode().
22b30 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 74  ** except that t
22b40 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73  he input express
22b50 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65  ion is guarantee
22b60 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65  d to be unchange
22b70 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
22b80 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50  e3ExprCodeCopy(P
22b90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
22ba0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
22bb0 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65  arget){.  sqlite
22bc0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
22bd0 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  db;.  pExpr = sq
22be0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
22bf0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66   pExpr, 0);.  if
22c00 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
22c10 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78 70  led ) sqlite3Exp
22c20 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
22c30 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
22c40 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
22c50 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  e(db, pExpr);.}.
22c60 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
22c70 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
22c80 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
22c90 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
22ca0 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
22cb0 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
22cc0 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
22cd0 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
22ce0 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
22cf0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
22d00 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  t.  If the expre
22d10 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
22d20 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
22d30 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68  tine.** might ch
22d40 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65  oose to code the
22d50 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69   expression at i
22d60 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
22d70 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
22d80 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
22d90 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  rable(Parse *pPa
22da0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
22db0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
22dc0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43   if( pParse->okC
22dd0 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73 71  onstFactor && sq
22de0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
22df0 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
22e00 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
22e10 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
22e20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30  pExpr, target, 0
22e30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22e40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
22e50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
22e60 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  arget);.  }.}../
22e70 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
22e80 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74 65  de that evaluate
22e90 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
22ea0 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20  ession and puts 
22eb0 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  the result.** in
22ec0 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
22ed0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b  ..**.** Also mak
22ee0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
22ef0 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c  expression resul
22f00 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20  ts into another 
22f10 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72  "cache" register
22f20 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  .** and modify t
22f30 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
22f40 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74   that the next t
22f50 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61  ime it is evalua
22f60 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ted,.** the resu
22f70 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  lt is a copy of 
22f80 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74  the cache regist
22f90 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
22fa0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
22fb0 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  or expressions t
22fc0 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c  hat are used mul
22fd0 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e  tiple .** times.
22fe0 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75    They are evalu
22ff0 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68  ated once and th
23000 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
23010 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
23020 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f  re reused..*/.vo
23030 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
23040 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
23050 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
23060 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
23070 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
23080 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
23090 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73   int iMem;..  as
230a0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
230b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
230c0 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
230d0 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ER );.  sqlite3E
230e0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
230f0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
23100 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73    iMem = ++pPars
23110 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
23120 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23130 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c  OP_Copy, target,
23140 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f   iMem);.  exprTo
23150 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20  Register(pExpr, 
23160 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iMem);.}../*.** 
23170 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
23180 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
23190 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
231a0 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
231b0 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
231c0 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75  list into a sequ
231d0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
231e0 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74  s beginning at t
231f0 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arget..**.** Ret
23200 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
23210 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75  f elements evalu
23220 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
23230 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20  SQLITE_ECEL_DUP 
23240 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68  flag prevents th
23250 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d  e arguments from
23260 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64   being.** filled
23270 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e   using OP_SCopy.
23280 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62    OP_Copy must b
23290 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  e used instead..
232a0 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
232b0 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67  _ECEL_FACTOR arg
232c0 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e  ument allows con
232d0 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  stant arguments 
232e0 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65  to be.** factore
232f0 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69  d out into initi
23300 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  alization code..
23310 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
23320 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d  _ECEL_REF flag m
23330 65 61 6e 73 20 74 68 61 74 20 65 78 70 72 65 73  eans that expres
23340 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73  sions in the lis
23350 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69  t with.** ExprLi
23360 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65  st.a[].u.x.iOrde
23370 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c  rByCol>0 have al
23380 72 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75  ready been evalu
23390 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a  ated and stored.
233a0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  ** in registers 
233b0 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73  at srcReg, and s
233c0 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20  o the value can 
233d0 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  be copied from t
233e0 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  here..*/.int sql
233f0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
23400 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
23410 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
23420 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
23430 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
23440 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st,   /* The exp
23450 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
23460 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
23470 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20  t target,       
23480 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
23490 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  te results */.  
234a0 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20 20  int srcReg,     
234b0 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67     /* Source reg
234c0 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54 45  isters if SQLITE
234d0 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75  _ECEL_REF */.  u
234e0 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  8 flags         
234f0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c    /* SQLITE_ECEL
23500 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
23510 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
23520 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
23530 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75  int i, j, n;.  u
23540 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67  8 copyOp = (flag
23550 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
23560 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a  DUP) ? OP_Copy :
23570 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62   OP_SCopy;.  Vdb
23580 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
23590 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
235a0 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  pList!=0 );.  as
235b0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
235c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
235d0 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20  se->pVdbe!=0 ); 
235e0 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74   /* Never gets t
235f0 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73  his far otherwis
23600 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74  e */.  n = pList
23610 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21  ->nExpr;.  if( !
23620 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
23630 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d  arse) ) flags &=
23640 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41   ~SQLITE_ECEL_FA
23650 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65  CTOR;.  for(pIte
23660 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
23670 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d   i<n; i++, pItem
23680 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
23690 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Expr = pItem->pE
236a0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c  xpr;.    if( (fl
236b0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
236c0 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20  L_REF)!=0 && (j 
236d0 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e  = pList->a[i].u.
236e0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30  x.iOrderByCol)>0
236f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23700 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
23710 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d  opyOp, j+srcReg-
23720 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  1, target+i);.  
23730 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
23740 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
23750 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73  _FACTOR)!=0 && s
23760 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
23770 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
23780 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23790 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
237a0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
237b0 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  +i, 0);.    }els
237c0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52  e{.      int inR
237d0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
237e0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
237f0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
23800 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  +i);.      if( i
23810 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  nReg!=target+i )
23820 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
23830 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69   *pOp;.        i
23840 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f  f( copyOp==OP_Co
23850 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  py.         && (
23860 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47  pOp=sqlite3VdbeG
23870 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70  etOp(v, -1))->op
23880 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  code==OP_Copy.  
23890 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
238a0 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52  1+pOp->p3+1==inR
238b0 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
238c0 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31  Op->p2+pOp->p3+1
238d0 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20  ==target+i.     
238e0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
238f0 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20  pOp->p3++;.     
23900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23910 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23920 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
23930 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69   inReg, target+i
23940 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
23950 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
23960 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
23970 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
23980 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
23990 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
239a0 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
239b0 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
239c0 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
239d0 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
239e0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
239f0 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
23a00 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
23a10 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
23a20 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
23a30 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f  ** elimination o
23a40 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78  f x..**.** The x
23a50 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72  JumpIf parameter
23a60 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61   determines deta
23a70 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55  ils:.**.**    NU
23a80 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
23a90 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20        Store the 
23aa0 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69  boolean result i
23ab0 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20  n reg[dest].**  
23ac0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
23ad0 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74  rue:      Jump t
23ae0 6f 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a  o dest if true.*
23af0 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  *    sqlite3Expr
23b00 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d  IfFalse:     Jum
23b10 70 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c  p to dest if fal
23b20 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d  se.**.** The jum
23b30 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65  pIfNull paramete
23b40 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  r is ignored if 
23b50 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e  xJumpIf is NULL.
23b60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23b70 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
23b80 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23b90 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
23ba0 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
23bb0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
23bc0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
23bd0 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45     /* The BETWEE
23be0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
23bf0 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
23c00 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
23c10 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61  ination or stora
23c20 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20  ge location */. 
23c30 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50   void (*xJump)(P
23c40 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c  arse*,Expr*,int,
23c50 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20  int), /* Action 
23c60 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74  to take */.  int
23c70 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
23c80 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * Take the jump 
23c90 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  if the BETWEEN i
23ca0 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78  s NULL */.){. Ex
23cb0 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20  pr exprAnd;     
23cc0 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61  /* The AND opera
23cd0 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44  tor in  x>=y AND
23ce0 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72   x<=z  */.  Expr
23cf0 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a   compLeft;    /*
23d00 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d   The  x>=y  term
23d10 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52   */.  Expr compR
23d20 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20  ight;   /* The  
23d30 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x<=z  term */.  
23d40 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20  Expr exprX;     
23d50 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62    /* The  x  sub
23d60 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
23d70 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
23d80 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75  ; /* Temporary u
23d90 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a  se register */..
23da0 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c  .  memset(&compL
23db0 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  eft, 0, sizeof(E
23dc0 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  xpr));.  memset(
23dd0 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73  &compRight, 0, s
23de0 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
23df0 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c  memset(&exprAnd,
23e00 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
23e10 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45  );..  assert( !E
23e20 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
23e30 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
23e40 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d  ct) );.  exprX =
23e50 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a   *pExpr->pLeft;.
23e60 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54    exprAnd.op = T
23e70 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64  K_AND;.  exprAnd
23e80 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65  .pLeft = &compLe
23e90 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52  ft;.  exprAnd.pR
23ea0 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68  ight = &compRigh
23eb0 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70  t;.  compLeft.op
23ec0 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70   = TK_GE;.  comp
23ed0 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  Left.pLeft = &ex
23ee0 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  prX;.  compLeft.
23ef0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
23f00 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
23f10 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  xpr;.  compRight
23f20 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63  .op = TK_LE;.  c
23f30 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d  ompRight.pLeft =
23f40 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52   &exprX;.  compR
23f50 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45  ight.pRight = pE
23f60 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
23f70 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72  1].pExpr;.  expr
23f80 54 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72  ToRegister(&expr
23f90 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  X, exprCodeVecto
23fa0 72 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  r(pParse, &exprX
23fb0 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
23fc0 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20   if( xJump ){.  
23fd0 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20    xJump(pParse, 
23fe0 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
23ff0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
24000 65 6c 73 65 7b 0a 20 20 20 20 65 78 70 72 58 2e  else{.    exprX.
24010 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d  flags |= EP_From
24020 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  Join;.    sqlite
24030 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
24040 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
24050 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73  , dest);.  }.  s
24060 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
24070 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
24080 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e  Free1);..  /* En
24090 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65  sure adequate te
240a0 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20  st coverage */. 
240b0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
240c0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
240d0 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
240e0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
240f0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
24100 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
24110 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
24120 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
24130 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
24140 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
24150 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
24160 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
24170 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
24180 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
24190 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
241a0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
241b0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
241c0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
241d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
241e0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
241f0 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
24200 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
24210 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
24220 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
24230 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
24240 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
24250 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
24260 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
24270 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
24280 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
24290 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
242a0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
242b0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
242c0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
242d0 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
242e0 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
242f0 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
24300 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d  e( xJump==0 );.}
24310 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
24320 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
24330 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
24340 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
24350 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
24360 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
24370 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
24380 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
24390 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
243a0 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
243b0 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
243c0 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
243d0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
243e0 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
243f0 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
24400 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
24410 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
24420 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
24430 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
24440 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
24450 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
24460 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
24470 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
24480 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
24490 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
244a0 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
244b0 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
244c0 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
244d0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
244e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
244f0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
24500 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
24510 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
24520 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
24530 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
24540 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
24550 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
24560 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
24570 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
24580 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
24590 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
245a0 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
245b0 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
245c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
245d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
245e0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
245f0 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
24600 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
24610 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
24620 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
24630 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
24640 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
24650 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
24660 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
24670 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
24680 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
24690 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
246a0 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
246b0 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75  v==0) )     retu
246c0 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63  rn;  /* Existenc
246d0 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
246e0 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
246f0 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
24700 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
24710 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63  /* No way this c
24720 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f  an happen */.  o
24730 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
24740 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
24750 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
24760 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
24770 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
24780 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
24790 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
247a0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
247b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
247c0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
247d0 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d  r->pLeft, d2,jum
247e0 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
247f0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
24800 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
24810 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
24820 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24830 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
24840 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
24850 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
24860 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24870 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
24880 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
24890 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
248a0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
248b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
248c0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
248d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
248e0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
248f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24900 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
24910 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
24920 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
24930 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24940 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
24950 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
24960 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
24970 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
24980 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
24990 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
249a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
249b0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
249c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
249d0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
249e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
249f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
24a00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24a10 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
24a20 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
24a30 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
24a40 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
24a50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
24a60 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
24a70 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20  TK_ISNOT:.      
24a80 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
24a90 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
24aa0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
24ab0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20  NOT );.      op 
24ac0 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
24ad0 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
24ae0 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20       jumpIfNull 
24af0 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
24b00 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
24b10 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  hru */.    case 
24b20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
24b30 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
24b40 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
24b50 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
24b60 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
24b70 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69  TK_EQ: {.      i
24b80 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
24b90 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c  Vector(pExpr->pL
24ba0 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61  eft) ) goto defa
24bb0 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20  ult_expr;.      
24bc0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
24bd0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
24be0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
24bf0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
24c00 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
24c10 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
24c20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
24c30 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
24c40 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
24c50 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
24c60 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
24c70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
24c80 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
24c90 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
24ca0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
24cb0 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
24cc0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
24cd0 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
24ce0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
24cf0 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
24d00 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
24d10 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
24d20 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
24d30 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
24d40 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
24d50 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
24d60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
24d70 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
24d80 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
24d90 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
24da0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
24db0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
24dc0 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
24dd0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
24de0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
24df0 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
24e00 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
24e10 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
24e20 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  se(op==OP_Eq);. 
24e30 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
24e40 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
24e50 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
24e60 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
24e70 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
24e80 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
24e90 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  q && jumpIfNull!
24ea0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
24eb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
24ec0 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
24ed0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
24ee0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
24ef0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
24f00 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
24f10 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l==SQLITE_NULLEQ
24f20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
24f30 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
24f40 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
24f50 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
24f60 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  Q);.      testca
24f70 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
24f80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
24f90 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
24fa0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
24fb0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
24fc0 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
24fd0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
24fe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
24ff0 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
25000 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ll );   testcase
25010 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
25020 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
25030 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
25040 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63  NotNull ); testc
25050 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
25060 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ULL );.      r1 
25070 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
25080 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
25090 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
250a0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
250b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
250c0 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
250d0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
250e0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
250f0 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
25100 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
25110 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
25120 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
25130 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
25140 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
25150 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
25160 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
25170 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
25180 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
25190 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
251a0 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
251b0 2c 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45  , dest, sqlite3E
251c0 78 70 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49  xprIfTrue, jumpI
251d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
251e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
251f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
25200 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
25210 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
25220 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
25230 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
25240 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
25250 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
25260 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64  = jumpIfNull ? d
25270 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73  est : destIfFals
25280 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
25290 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
252a0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66  e, pExpr, destIf
252b0 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c  False, destIfNul
252c0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
252d0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
252e0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
252f0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
25300 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
25310 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
25320 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
25330 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
25340 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20  default_expr:.  
25350 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61      if( exprAlwa
25360 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b  ysTrue(pExpr) ){
25370 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25380 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
25390 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
253a0 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  f( exprAlwaysFal
253b0 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  se(pExpr) ){.   
253c0 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f       /* No-op */
253d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
253e0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
253f0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
25400 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
25410 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
25420 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25430 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31  Op3(v, OP_If, r1
25440 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
25450 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll!=0);.        
25460 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
25470 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
25480 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
25490 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
254a0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
254b0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
254c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
254d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
254e0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
254f0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
25500 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
25510 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
25520 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f  egFree2);  .}../
25530 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
25540 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
25550 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
25560 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
25570 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
25580 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
25590 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
255a0 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
255b0 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
255c0 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
255d0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
255e0 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
255f0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
25600 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
25610 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
25620 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
25630 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
25640 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49  mpIfNull is SQLI
25650 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72  TE_JUMPIFNULL or
25660 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66   fall through if
25670 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69   jumpIfNull.** i
25680 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s 0..*/.void sql
25690 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
256a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
256b0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
256c0 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
256d0 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
256e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
256f0 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
25700 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
25710 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
25720 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
25730 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
25740 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
25750 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
25760 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
25770 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
25780 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f  ==0) ) return; /
25790 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56  * Existence of V
257a0 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
257b0 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70  aller */.  if( p
257c0 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74  Expr==0 )    ret
257d0 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76  urn;..  /* The v
257e0 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f  alue of pExpr->o
257f0 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c  p and op are rel
25800 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
25810 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
25820 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20   pExpr->op      
25830 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20        op.  **   
25840 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20      ---------   
25850 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
25860 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  -.  **       TK_
25870 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20  ISNULL          
25880 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20  OP_NotNull.  ** 
25890 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c        TK_NOTNULL
258a0 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75           OP_IsNu
258b0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
258c0 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _NE             
258d0 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20   OP_Eq.  **     
258e0 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20    TK_EQ         
258f0 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20       OP_Ne.  ** 
25900 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20        TK_GT     
25910 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20           OP_Le. 
25920 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20   **       TK_LE 
25930 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
25940 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Gt.  **       TK
25950 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _GE             
25960 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Lt.  **     
25970 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20    TK_LT         
25980 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a       OP_Ge.  **.
25990 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76    ** For other v
259a0 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e  alues of pExpr->
259b0 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69  op, op is undefi
259c0 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a  ned and unused..
259d0 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    ** The value o
259e0 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
259f0 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61  nstants are arra
25a00 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77  nged such that w
25a10 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75  e.  ** can compu
25a20 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61  te the mapping a
25a30 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66  bove using the f
25a40 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73  ollowing express
25a50 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74  ion..  ** Assert
25a60 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20  ()s verify that 
25a70 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
25a80 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f  is correct..  */
25a90 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d  .  op = ((pExpr-
25aa0 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  >op+(TK_ISNULL&1
25ab0 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c  ))^1)-(TK_ISNULL
25ac0 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  &1);..  /* Verif
25ad0 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d  y correct alignm
25ae0 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  ent of TK_ and O
25af0 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a  P_ constants.  *
25b00 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  /.  assert( pExp
25b10 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  r->op!=TK_ISNULL
25b20 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75   || op==OP_NotNu
25b30 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
25b40 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f  pExpr->op!=TK_NO
25b50 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TNULL || op==OP_
25b60 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  IsNull );.  asse
25b70 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
25b80 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45  K_NE || op==OP_E
25b90 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  q );.  assert( p
25ba0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20  Expr->op!=TK_EQ 
25bb0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  || op==OP_Ne );.
25bc0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
25bd0 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70  >op!=TK_LT || op
25be0 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ge );.  ass
25bf0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
25c00 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LE || op==OP_
25c10 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Gt );.  assert( 
25c20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54  pExpr->op!=TK_GT
25c30 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b   || op==OP_Le );
25c40 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
25c50 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f  ->op!=TK_GE || o
25c60 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73  p==OP_Lt );..  s
25c70 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
25c80 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
25c90 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  AND: {.      tes
25ca0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
25cb0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
25cc0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25cd0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
25ce0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
25cf0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
25d00 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
25d10 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
25d20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25d30 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
25d40 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
25d50 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
25d60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25d70 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
25d80 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
25d90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
25da0 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
25db0 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
25dc0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
25dd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25de0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
25df0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25e00 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
25e10 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
25e20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53  d2, jumpIfNull^S
25e30 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
25e40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25e50 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
25e60 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
25e70 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
25e80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
25e90 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
25ea0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
25eb0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
25ec0 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
25ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25ee0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
25ef0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
25f00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
25f10 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
25f20 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
25f30 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
25f40 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
25f50 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
25f60 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
25f70 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
25f80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
25f90 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
25fa0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
25fb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25fc0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
25fd0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
25fe0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
25ff0 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
26000 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f    op = (pExpr->o
26010 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e  p==TK_IS) ? TK_N
26020 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  E : TK_EQ;.     
26030 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51   jumpIfNull = SQ
26040 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
26050 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
26060 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
26070 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
26080 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
26090 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
260a0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
260b0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
260c0 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  Q: {.      if( s
260d0 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
260e0 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  or(pExpr->pLeft)
260f0 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f   ) goto default_
26100 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74  expr;.      test
26110 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
26120 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
26130 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
26140 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
26150 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
26160 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
26170 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
26180 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
26190 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
261a0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
261b0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
261c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
261d0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
261e0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
261f0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
26200 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
26210 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26220 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
26230 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
26240 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
26250 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
26260 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
26270 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
26280 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
26290 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
262a0 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
262b0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
262c0 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
262d0 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
262e0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
262f0 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
26300 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
26310 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
26320 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
26330 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
26340 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
26350 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
26360 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
26370 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
26380 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
26390 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
263a0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
263b0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
263c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
263d0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
263e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
263f0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
26400 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
26410 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
26420 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  e(op==OP_Ne);.  
26430 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
26440 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
26450 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
26460 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
26470 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
26480 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
26490 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
264a0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
264b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
264c0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
264d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
264e0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
264f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26500 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
26510 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
26520 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
26530 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
26540 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
26550 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
26560 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
26570 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26580 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
26590 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
265a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
265b0 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f  NULL );   VdbeCo
265c0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
265d0 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
265e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
265f0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56  TK_NOTNULL );  V
26600 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26610 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
26620 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
26630 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
26640 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26650 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
26660 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
26670 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
26680 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
26690 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
266a0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
266b0 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78   dest, sqlite3Ex
266c0 70 72 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49  prIfFalse, jumpI
266d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
266e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
266f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
26700 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
26710 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
26720 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29  if( jumpIfNull )
26730 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26740 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
26750 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
26760 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
26770 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
26780 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
26790 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
267a0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  el(v);.        s
267b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
267c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
267d0 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c  dest, destIfNull
267e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
267f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
26800 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
26810 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
26820 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
26830 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
26840 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f  : {.    default_
26850 65 78 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28  expr: .      if(
26860 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
26870 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
26880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
26890 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
268a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70     }else if( exp
268b0 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70  rAlwaysTrue(pExp
268c0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
268d0 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   no-op */.      
268e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
268f0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
26900 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
26910 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
26920 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26930 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
26940 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65  OP_IfNot, r1, de
26950 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
26960 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
26970 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
26980 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
26990 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
269a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
269b0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
269c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
269d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
269e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
269f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
26a00 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
26a10 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
26a20 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
26a30 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ee2);.}../*.** L
26a40 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 49  ike sqlite3ExprI
26a50 66 46 61 6c 73 65 28 29 20 65 78 63 65 70 74 20  fFalse() except 
26a60 74 68 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d  that a copy is m
26a70 61 64 65 20 6f 66 20 70 45 78 70 72 20 62 65 66  ade of pExpr bef
26a80 6f 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65  ore.** code gene
26a90 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74  ration, and that
26aa0 20 63 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64   copy is deleted
26ab0 20 61 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65   after code gene
26ac0 72 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20  ration. This.** 
26ad0 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
26ae0 20 6f 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20   original pExpr 
26af0 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  is unchanged..*/
26b00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
26b10 72 49 66 46 61 6c 73 65 44 75 70 28 50 61 72 73  rIfFalseDup(Pars
26b20 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
26b30 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
26b40 2c 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ,int jumpIfNull)
26b50 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
26b60 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
26b70 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71  Expr *pCopy = sq
26b80 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
26b90 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66   pExpr, 0);.  if
26ba0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
26bb0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ed==0 ){.    sql
26bc0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
26bd0 70 50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64  pParse, pCopy, d
26be0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
26bf0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
26c00 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
26c10 6f 70 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  opy);.}.../*.** 
26c20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72  Do a deep compar
26c30 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72  ison of two expr
26c40 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52  ession trees.  R
26c50 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
26c60 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  wo.** expression
26c70 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79  s are completely
26c80 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74   identical.  Ret
26c90 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64 69  urn 1 if they di
26ca0 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20  ffer only.** by 
26cb0 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  a COLLATE operat
26cc0 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65  or at the top le
26cd0 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69  vel.  Return 2 i
26ce0 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
26cf0 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72  erences.** other
26d00 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65   than the top-le
26d10 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  vel COLLATE oper
26d20 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
26d30 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66  ny subelement of
26d40 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61   pB has Expr.iTa
26d50 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69  ble==(-1) then i
26d60 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  t is allowed.** 
26d70 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  to compare equal
26d80 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   to an equivalen
26d90 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20  t element in pA 
26da0 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65  with Expr.iTable
26db0 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  ==iTab..**.** Th
26dc0 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20  e pA side might 
26dd0 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  be using TK_REGI
26de0 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20 69  STER.  If that i
26df0 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 70  s the case and p
26e00 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e  B is.** not usin
26e10 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75  g TK_REGISTER bu
26e20 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 65  t is otherwise e
26e30 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20  quivalent, then 
26e40 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a  still return 0..
26e50 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
26e60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
26e70 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20  l return 2 even 
26e80 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
26e90 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79  ssions.** really
26ea0 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   are equivalent.
26eb0 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70    If we cannot p
26ec0 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78  rove that the ex
26ed0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
26ee0 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72   identical, we r
26ef0 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20  eturn 2 just to 
26f00 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
26f10 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
26f20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20  returns 2, then 
26f30 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c  you do not reall
26f40 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61  y know for certa
26f50 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a  in if the two.**
26f60 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
26f70 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
26f80 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f  if you get a 0 o
26f90 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e  r 1 return, then
26fa0 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73   you.** can be s
26fb0 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ure the expressi
26fc0 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
26fd0 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73  .  In the places
26fe0 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72   where.** this r
26ff0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20  outine is used, 
27000 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74  it does not hurt
27010 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61   to get an extra
27020 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73   2 - that.** jus
27030 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
27040 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20  n some slightly 
27050 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75  slower code.  Bu
27060 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  t returning.** a
27070 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72  n incorrect 0 or
27080 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f   1 could lead to
27090 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a   a malfunction..
270a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
270b0 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
270c0 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e  pA, Expr *pB, in
270d0 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63  t iTab){.  u32 c
270e0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20  ombinedFlags;.  
270f0 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
27100 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
27110 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b   pB==pA ? 0 : 2;
27120 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46  .  }.  combinedF
27130 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73  lags = pA->flags
27140 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20   | pB->flags;.  
27150 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
27160 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
27170 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e  ){.    if( (pA->
27180 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26  flags&pB->flags&
27190 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20  EP_IntValue)!=0 
271a0 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d  && pA->u.iValue=
271b0 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b  =pB->u.iValue ){
271c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
271d0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
271e0 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 2;.  }.  if( p
271f0 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b  A->op!=pB->op ){
27200 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
27210 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73  =TK_COLLATE && s
27220 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
27230 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c  e(pA->pLeft, pB,
27240 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20   iTab)<2 ){.    
27250 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
27260 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70  }.    if( pB->op
27270 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
27280 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
27290 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74  re(pA, pB->pLeft
272a0 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20  , iTab)<2 ){.   
272b0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
272c0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
272d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
272e0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
272f0 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43  pA->op!=TK_AGG_C
27300 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a  OLUMN && pA->u.z
27310 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  Token ){.    if(
27320 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43   pA->op==TK_FUNC
27330 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66  TION ){.      if
27340 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
27350 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42  (pA->u.zToken,pB
27360 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29  ->u.zToken)!=0 )
27370 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
27380 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
27390 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
273a0 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  >u.zToken)!=0 ){
273b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
273c0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
273d0 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a   ? 1 : 2;.    }.
273e0 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66    }.  if( (pA->f
273f0 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
27400 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
27410 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
27420 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
27430 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65   ALWAYS((combine
27440 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65  dFlags & EP_Toke
27450 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20  nOnly)==0) ){.  
27460 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c    if( combinedFl
27470 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
27480 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  ct ) return 2;. 
27490 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
274a0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
274b0 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20  eft, pB->pLeft, 
274c0 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
274d0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
274e0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
274f0 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69  >pRight, pB->pRi
27500 67 68 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ght, iTab) ) ret
27510 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
27520 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
27530 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73  mpare(pA->x.pLis
27540 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20  t, pB->x.pList, 
27550 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
27560 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  ;.    if( ALWAYS
27570 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ((combinedFlags 
27580 26 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30  & EP_Reduced)==0
27590 29 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f  ) && pA->op!=TK_
275a0 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 20 20  STRING ){.      
275b0 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21  if( pA->iColumn!
275c0 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72  =pB->iColumn ) r
275d0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69  eturn 2;.      i
275e0 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70  f( pA->iTable!=p
275f0 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20  B->iTable .     
27600 20 20 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65    && (pA->iTable
27610 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28  !=iTab || NEVER(
27620 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20  pB->iTable>=0)) 
27630 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
27640 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
27650 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
27660 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  re two ExprList 
27670 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e  objects.  Return
27680 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20 69   0 if they are i
27690 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a  dentical and .**
276a0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
276b0 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20  y differ in any 
276c0 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  way..**.** If an
276d0 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20  y subelement of 
276e0 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62  pB has Expr.iTab
276f0 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74  le==(-1) then it
27700 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
27710 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  o compare equal 
27720 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  to an equivalent
27730 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77   element in pA w
27740 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  ith Expr.iTable=
27750 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  =iTab..**.** Thi
27760 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
27770 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
27780 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45  for equivalent E
27790 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a  xprLists.  The.*
277a0 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e  * only consequen
277b0 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62  ce will be disab
277c0 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  led optimization
277d0 73 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  s.  But this rou
277e0 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76  tine.** must nev
277f0 65 72 20 72 65 74 75 72 6e 20 30 20 69 66 20 74  er return 0 if t
27800 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  he two ExprList 
27810 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69 66 66  objects are diff
27820 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d  erent, or.** a m
27830 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  alfunction will 
27840 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77  result..**.** Tw
27850 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20  o NULL pointers 
27860 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
27870 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20  o be the same.  
27880 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  But a NULL point
27890 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66  er.** always dif
278a0 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  fers from a non-
278b0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
278c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
278d0 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72  ListCompare(Expr
278e0 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69  List *pA, ExprLi
278f0 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  st *pB, int iTab
27900 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
27910 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30  ( pA==0 && pB==0
27920 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
27930 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
27940 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
27950 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70  if( pA->nExpr!=p
27960 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72  B->nExpr ) retur
27970 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 1;.  for(i=0; 
27980 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  i<pA->nExpr; i++
27990 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
279a0 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70  prA = pA->a[i].p
279b0 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
279c0 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69  pExprB = pB->a[i
279d0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
279e0 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72   pA->a[i].sortOr
279f0 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f  der!=pB->a[i].so
27a00 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e  rtOrder ) return
27a10 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
27a20 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
27a30 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69  ExprA, pExprB, i
27a40 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Tab) ) return 1;
27a50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
27a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
27a70 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e 20   true if we can 
27a80 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77 69  prove the pE2 wi
27a90 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ll always be tru
27aa0 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74  e if pE1 is.** t
27ab0 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  rue.  Return fal
27ac0 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  se if we cannot 
27ad0 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f  complete the pro
27ae0 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67  of or if pE2 mig
27af0 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20  ht.** be false. 
27b00 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
27b10 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20       pE1: x==5  
27b20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
27b30 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
27b40 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
27b50 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70  E1: x>0        p
27b60 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
27b70 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c       Result: fal
27b80 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  se.**     pE1: x
27b90 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20 78  =21       pE2: x
27ba0 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20  =21 OR y=43     
27bb0 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
27bc0 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20      pE1: x!=123 
27bd0 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
27be0 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
27bf0 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
27c00 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45  1: x!=?1      pE
27c10 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
27c20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
27c30 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
27c40 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49  S NULL  pE2: x I
27c50 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
27c60 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20  sult: false.**  
27c70 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20     pE1: x IS ?2 
27c80 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
27c90 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a   NULL    Reuslt:
27ca0 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65   false.**.** Whe
27cb0 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43  n comparing TK_C
27cc0 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77  OLUMN nodes betw
27cd0 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c  een pE1 and pE2,
27ce0 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45   if pE2 has.** E
27cf0 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65  xpr.iTable<0 the
27d00 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65  n assume a table
27d10 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79   number given by
27d20 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   iTab..**.** Whe
27d30 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75  n in doubt, retu
27d40 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72  rn false.  Retur
27d50 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20  ning true might 
27d60 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
27d70 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e  ce.** improvemen
27d80 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61  t.  Returning fa
27d90 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73 65 20  lse might cause 
27da0 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  a performance re
27db0 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  duction, but.** 
27dc0 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67  it will always g
27dd0 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  ive the correct 
27de0 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68 65  answer and is he
27df0 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e  nce always safe.
27e00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
27e10 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 45  xprImpliesExpr(E
27e20 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a  xpr *pE1, Expr *
27e30 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  pE2, int iTab){.
27e40 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
27e50 72 43 6f 6d 70 61 72 65 28 70 45 31 2c 20 70 45  rCompare(pE1, pE
27e60 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20  2, iTab)==0 ){. 
27e70 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
27e80 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
27e90 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c  TK_OR.   && (sql
27ea0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
27eb0 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c  xpr(pE1, pE2->pL
27ec0 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20  eft, iTab).     
27ed0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
27ee0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
27ef0 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67  r(pE1, pE2->pRig
27f00 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b  ht, iTab) ).  ){
27f10 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
27f20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70   }.  if( pE2->op
27f30 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20  ==TK_NOTNULL.   
27f40 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
27f50 6d 70 61 72 65 28 70 45 31 2d 3e 70 4c 65 66 74  mpare(pE1->pLeft
27f60 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54  , pE2->pLeft, iT
27f70 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 45  ab)==0.   && (pE
27f80 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  1->op!=TK_ISNULL
27f90 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f   && pE1->op!=TK_
27fa0 49 53 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  IS).  ){.    ret
27fb0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
27fc0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
27fd0 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
27fe0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
27ff0 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62  ucture is used b
28000 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65  y the tree walke
28010 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  r.** to determin
28020 65 20 69 66 20 61 6e 20 65 78 70 72 65 73 73 69  e if an expressi
28030 6f 6e 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61  on can be evalua
28040 74 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 65  ted by reference
28050 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78   to the.** index
28060 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20 68   only, without h
28070 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 20 73 65  aving to do a se
28080 61 72 63 68 20 66 6f 72 20 74 68 65 20 63 6f 72  arch for the cor
28090 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61  responding.** ta
280a0 62 6c 65 20 65 6e 74 72 79 2e 20 20 54 68 65 20  ble entry.  The 
280b0 49 64 78 43 6f 76 65 72 2e 70 49 64 78 20 66 69  IdxCover.pIdx fi
280c0 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64 65 78  eld is the index
280d0 2e 20 20 49 64 78 43 6f 76 65 72 2e 69 43 75 72  .  IdxCover.iCur
280e0 0a 2a 2a 20 69 73 20 74 68 65 20 63 75 72 73 6f  .** is the curso
280f0 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  r for the table.
28100 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 43 6f  .*/.struct IdxCo
28110 76 65 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ver {.  Index *p
28120 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  Idx;     /* The 
28130 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
28140 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20  ed for coverage 
28150 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
28160 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
28170 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
28180 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  able correspondi
28190 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ng to the index 
281a0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  */.};../*.** Che
281b0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
281c0 72 65 20 61 72 65 20 72 65 66 65 72 65 6e 63 65  re are reference
281d0 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
281e0 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65  table .** pWalke
281f0 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
28200 69 43 75 72 20 63 61 6e 20 62 65 20 73 61 74 69  iCur can be sati
28210 73 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20  sfied using the 
28220 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72  index.** pWalker
28230 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70  ->u.pIdxCover->p
28240 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Idx..*/.static i
28250 6e 74 20 65 78 70 72 49 64 78 43 6f 76 65 72 28  nt exprIdxCover(
28260 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
28270 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
28280 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
28290 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20  TK_COLUMN.   && 
282a0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
282b0 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
282c0 76 65 72 2d 3e 69 43 75 72 0a 20 20 20 26 26 20  ver->iCur.   && 
282d0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
282e0 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e  ndex(pWalker->u.
282f0 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c  pIdxCover->pIdx,
28300 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
28310 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c  <0.  ){.    pWal
28320 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
28330 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
28340 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  bort;.  }.  retu
28350 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
28360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
28370 69 6e 65 20 69 66 20 61 6e 20 69 6e 64 65 78 20  ine if an index 
28380 70 49 64 78 20 6f 6e 20 74 61 62 6c 65 20 77 69  pIdx on table wi
28390 74 68 20 63 75 72 73 6f 72 20 69 43 75 72 20 63  th cursor iCur c
283a0 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20  ontains will.** 
283b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
283c0 45 78 70 72 2e 20 20 52 65 74 75 72 6e 20 74 72  Expr.  Return tr
283d0 75 65 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ue if the index 
283e0 64 6f 65 73 20 63 6f 76 65 72 20 74 68 65 0a 2a  does cover the.*
283f0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
28400 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 45   false if the pE
28410 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 72  xpr expression r
28420 65 66 65 72 65 6e 63 65 73 20 74 61 62 6c 65 20  eferences table 
28430 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20  columns.** that 
28440 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e  are not found in
28450 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 2e   the index pIdx.
28460 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20  .**.** An index 
28470 63 6f 76 65 72 69 6e 67 20 61 6e 20 65 78 70 72  covering an expr
28480 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  ession means tha
28490 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
284a0 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75   can be.** evalu
284b0 61 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20  ated using only 
284c0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 77 69  the index and wi
284d0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
284e0 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f  lookup the.** co
284f0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
28500 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20  e entry..*/.int 
28510 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72  sqlite3ExprCover
28520 65 64 42 79 49 6e 64 65 78 28 0a 20 20 45 78 70  edByIndex(.  Exp
28530 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
28540 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
28550 20 62 65 20 74 65 73 74 65 64 20 2a 2f 0a 20 20   be tested */.  
28560 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
28570 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
28580 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
28590 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
285a0 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  able */.  Index 
285b0 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
285c0 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   The index that 
285d0 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 66 6f  might be used fo
285e0 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b  r coverage */.){
285f0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
28600 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 78  truct IdxCover x
28610 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  cov;.  memset(&w
28620 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
28630 0a 20 20 78 63 6f 76 2e 69 43 75 72 20 3d 20 69  .  xcov.iCur = i
28640 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78  Cur;.  xcov.pIdx
28650 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78   = pIdx;.  w.xEx
28660 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
28670 72 49 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75  rIdxCover;.  w.u
28680 2e 70 49 64 78 43 6f 76 65 72 20 3d 20 26 78 63  .pIdxCover = &xc
28690 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ov;.  sqlite3Wal
286a0 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
286b0 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e 65 43  ;.  return !w.eC
286c0 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  ode;.}.../*.** A
286d0 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
286e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
286f0 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79  cture is used by
28700 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72   the tree walker
28710 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66  .** to count ref
28720 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65  erences to table
28730 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
28740 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20  arguments of an 
28750 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75  .** aggregate fu
28760 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72  nction, in order
28770 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
28780 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63  e.** sqlite3Func
28790 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f  tionThisSrc() ro
287a0 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  utine..*/.struct
287b0 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72   SrcCount {.  Sr
287c0 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f  cList *pSrc;   /
287d0 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72  * One particular
287e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
287f0 61 20 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a  a nested query *
28800 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20  /.  int nThis;  
28810 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28820 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
28830 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c  columns in pSrcL
28840 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74  ist */.  int nOt
28850 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  her;      /* Num
28860 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
28870 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
28880 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
28890 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  es */.};../*.** 
288a0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
288b0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
288c0 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74  o columns..*/.st
288d0 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 72 63  atic int exprSrc
288e0 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  Count(Walker *pW
288f0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
28900 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45  pr){.  /* The NE
28910 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63  VER() on the sec
28920 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63 61  ond term is beca
28930 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74  use sqlite3Funct
28940 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29  ionUsesThisSrc()
28950 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  .  ** is always 
28960 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71  called before sq
28970 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
28980 41 67 67 72 65 67 61 74 65 73 28 29 20 61 6e 64  Aggregates() and
28990 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f   so the.  ** TK_
289a0 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74  COLUMNs have not
289b0 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72   yet been conver
289c0 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f  ted into TK_AGG_
289d0 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a  COLUMN.  If.  **
289e0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
289f0 55 73 65 73 54 68 69 73 53 72 63 28 29 20 69 73  UsesThisSrc() is
28a00 20 75 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c   used differentl
28a10 79 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  y in the future,
28a20 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28   the.  ** NEVER(
28a30 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  ) will need to b
28a40 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20  e removed. */.  
28a50 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
28a60 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45  K_COLUMN || NEVE
28a70 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  R(pExpr->op==TK_
28a80 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20  AGG_COLUMN) ){. 
28a90 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
28aa0 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70  ruct SrcCount *p
28ab0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53   = pWalker->u.pS
28ac0 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63  rcCount;.    Src
28ad0 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
28ae0 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53  pSrc;.    int nS
28af0 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63  rc = pSrc ? pSrc
28b00 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20  ->nSrc : 0;.    
28b10 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b  for(i=0; i<nSrc;
28b20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
28b30 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
28b40 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
28b50 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
28b60 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63  }.    if( i<nSrc
28b70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68   ){.      p->nTh
28b80 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  is++;.    }else{
28b90 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72  .      p->nOther
28ba0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
28bb0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
28bc0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  nue;.}../*.** De
28bd0 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f  termine if any o
28be0 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  f the arguments 
28bf0 74 6f 20 74 68 65 20 70 45 78 70 72 20 46 75 6e  to the pExpr Fun
28c00 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a  ction reference.
28c10 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65  ** pSrcList.  Re
28c20 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
28c30 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75  y do.  Also retu
28c40 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66  rn true if the f
28c50 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e  unction.** has n
28c60 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68  o arguments or h
28c70 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  as only constant
28c80 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
28c90 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78  urn false if pEx
28ca0 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  pr.** references
28cb0 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74   columns but not
28cc0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c   columns of tabl
28cd0 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63  es found in pSrc
28ce0 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  List..*/.int sql
28cf0 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
28d00 54 68 69 73 53 72 63 28 45 78 70 72 20 2a 70 45  ThisSrc(Expr *pE
28d10 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53  xpr, SrcList *pS
28d20 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65  rcList){.  Walke
28d30 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72  r w;.  struct Sr
28d40 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73  cCount cnt;.  as
28d50 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
28d60 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
28d70 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   );.  memset(&w,
28d80 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
28d90 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
28da0 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74  k = exprSrcCount
28db0 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e  ;.  w.u.pSrcCoun
28dc0 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e  t = &cnt;.  cnt.
28dd0 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b  pSrc = pSrcList;
28de0 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30  .  cnt.nThis = 0
28df0 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d  ;.  cnt.nOther =
28e00 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   0;.  sqlite3Wal
28e10 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45  kExprList(&w, pE
28e20 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
28e30 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69   return cnt.nThi
28e40 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65  s>0 || cnt.nOthe
28e50 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  r==0;.}../*.** A
28e60 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
28e70 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
28e80 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20  ->aCol[] array. 
28e90 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
28ea0 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
28eb0 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
28ec0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
28ed0 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
28ee0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
28ef0 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  t addAggInfoColu
28f00 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  mn(sqlite3 *db, 
28f10 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
28f20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
28f30 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65  o->aCol = sqlite
28f40 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
28f50 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
28f60 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20    pInfo->aCol,. 
28f70 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
28f80 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20  fo->aCol[0]),.  
28f90 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f       &pInfo->nCo
28fa0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a  lumn,.       &i.
28fb0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
28fc0 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64  .}    ../*.** Ad
28fd0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
28fe0 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
28ff0 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20  >aFunc[] array. 
29000 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
29010 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
29020 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
29030 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
29040 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
29050 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
29060 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  t addAggInfoFunc
29070 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
29080 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
29090 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
290a0 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >aFunc = sqlite3
290b0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
290c0 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20        db, .     
290d0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a    pInfo->aFunc,.
290e0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
290f0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a  nfo->aFunc[0]),.
29100 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
29110 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  Func,.       &i.
29120 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
29130 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .}    ../*.** Th
29140 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43  is is the xExprC
29150 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72  allback for a tr
29160 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69  ee walker.  It i
29170 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70  s used to.** imp
29180 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78  lement sqlite3Ex
29190 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
291a0 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69  tes().  See sqli
291b0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
291c0 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20  gregates.** for 
291d0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
291e0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
291f0 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
29200 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70  regate(Walker *p
29210 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
29220 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
29230 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
29240 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
29250 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  NC;.  Parse *pPa
29260 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
29270 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e;.  SrcList *pS
29280 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
29290 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66  rcList;.  AggInf
292a0 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e  o *pAggInfo = pN
292b0 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20  C->pAggInfo;..  
292c0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
292d0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
292e0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
292f0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
29300 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
29310 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
29320 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
29330 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
29340 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
29350 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  UMN );.      /* 
29360 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
29370 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
29380 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
29390 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
293a0 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
293b0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
293c0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
293d0 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69  f( ALWAYS(pSrcLi
293e0 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
293f0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
29400 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
29410 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
29420 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
29430 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
29440 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
29450 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
29460 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
29470 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
29480 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
29490 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
294a0 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
294b0 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
294c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
294d0 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
294e0 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
294f0 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
29500 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
29510 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70   means that pExp
29520 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  r refers to a ta
29530 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
29540 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  ** that is in th
29550 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
29560 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
29570 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20  uery.  .        
29580 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
29590 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e     ** Make an en
295a0 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  try for the colu
295b0 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  mn in pAggInfo->
295c0 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a  aCol[] if there.
295d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
295e0 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74  s not an entry t
295f0 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
29600 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
29610 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
29620 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
29630 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f   = pAggInfo->aCo
29640 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  l;.            f
29650 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e  or(k=0; k<pAggIn
29660 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  fo->nColumn; k++
29670 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
29680 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
29690 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  l->iTable==pExpr
296a0 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
296b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
296c0 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  ol->iColumn==pEx
296d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
296e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
296f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
29700 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29710 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
29720 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f  if( (k>=pAggInfo
29730 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20  ->nColumn).     
29740 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20          && (k = 
29750 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
29760 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
29770 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20  gInfo))>=0 .    
29780 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
29790 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
297a0 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
297b0 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k];.            
297c0 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70    pCol->pTab = p
297d0 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
297e0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
297f0 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  iTable = pExpr->
29800 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
29810 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
29820 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
29830 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
29840 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d      pCol->iMem =
29850 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
29860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
29870 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
29880 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
29890 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78         pCol->pEx
298a0 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
298b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
298c0 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
298d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
298e0 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20      int j, n;.  
298f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
29900 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41  prList *pGB = pA
29910 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
29920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29930 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
29940 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20  t_item *pTerm = 
29950 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  pGB->a;.        
29960 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d          n = pGB-
29970 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
29980 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
29990 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d   j<n; j++, pTerm
299a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
299b0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20         Expr *pE 
299c0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
299d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299e0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
299f0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69  _COLUMN && pE->i
29a00 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
29a10 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
29a30 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
29a40 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
29a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a60 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
29a70 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
29a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
29a90 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
29aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29ab0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29ac0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29ad0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
29ae0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
29af0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
29b00 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
29b10 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67  terColumn = pAgg
29b20 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f  Info->nSortingCo
29b30 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
29b40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29b50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29b60 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
29b70 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70  w an entry for p
29b80 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f  Expr in pAggInfo
29b90 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72  ->aCol[] (either
29ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
29bb0 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74  because it was t
29bc0 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62  here before or b
29bd0 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63  ecause we just c
29be0 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20  reated it)..    
29bf0 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65          ** Conve
29c00 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20  rt the pExpr to 
29c10 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  be a TK_AGG_COLU
29c20 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20  MN referring to 
29c30 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20  that.           
29c40 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   ** pAggInfo->aC
29c50 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20  ol[] entry..    
29c60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
29c70 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
29c80 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
29c90 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
29ca0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
29cb0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
29cc0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  gInfo;.         
29cd0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
29ce0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20  K_AGG_COLUMN;.  
29cf0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
29d00 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a  >iAgg = (i16)k;.
29d10 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
29d20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f  k;.          } /
29d30 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69  * endif pExpr->i
29d40 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
29d50 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  ursor */.       
29d60 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f   } /* end loop o
29d70 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a  ver pSrcList */.
29d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
29d90 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
29da0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
29db0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
29dc0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43  {.      if( (pNC
29dd0 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49  ->ncFlags & NC_I
29de0 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20  nAggFunc)==0.   
29df0 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e      && pWalker->
29e00 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78  walkerDepth==pEx
29e10 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b  pr->op2.      ){
29e20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
29e30 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
29e40 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
29e50 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
29e60 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
29e70 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
29e80 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
29e90 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
29ea0 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
29eb0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
29ec0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
29ed0 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
29ee0 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
29ef0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
29f00 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
29f10 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
29f20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
29f30 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d  prCompare(pItem-
29f40 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d  >pExpr, pExpr, -
29f50 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
29f60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29f80 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  }.        if( i>
29f90 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  =pAggInfo->nFunc
29fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
29fb0 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e   pExpr is origin
29fc0 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20  al.  Make a new 
29fd0 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66  entry in pAggInf
29fe0 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20  o->aFunc[].     
29ff0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2a000 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70    u8 enc = ENC(p
2a010 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
2a020 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67        i = addAgg
2a030 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d  InfoFunc(pParse-
2a040 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a  >db, pAggInfo);.
2a050 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
2a060 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2a070 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2a080 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2a090 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2a0a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2a0b0 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
2a0c0 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
2a0d0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
2a0e0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
2a0f0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2a100 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
2a110 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
2a120 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2a130 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2a140 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
2a150 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2a160 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73  pItem->pFunc = s
2a170 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
2a180 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  on(pParse->db,. 
2a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1a0 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
2a1b0 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  n, .            
2a1c0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e         pExpr->x.
2a1d0 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78  pList ? pExpr->x
2a1e0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  .pList->nExpr : 
2a1f0 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
2a200 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
2a210 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  r->flags & EP_Di
2a220 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
2a230 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
2a240 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
2a250 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
2a260 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2a270 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2a280 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  m->iDistinct = -
2a290 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
2a2a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2a2b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
2a2c0 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69  * Make pExpr poi
2a2d0 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  nt to the approp
2a2e0 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e  riate pAggInfo->
2a2f0 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20  aFunc[] entry.  
2a300 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2a310 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2a320 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2a330 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
2a340 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
2a350 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
2a360 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2a370 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
2a380 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
2a390 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20   = (i16)i;.     
2a3a0 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
2a3b0 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
2a3c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2a3d0 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
2a3e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
2a3f0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2a400 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
2a410 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2a420 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74  C_Continue;.}.st
2a430 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
2a440 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
2a450 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ct(Walker *pWalk
2a460 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  er, Select *pSel
2a470 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ect){.  UNUSED_P
2a480 41 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72  ARAMETER(pWalker
2a490 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2a4a0 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a  METER(pSelect);.
2a4b0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2a4c0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2a4d0 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70  Analyze the pExp
2a4e0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f  r expression loo
2a4f0 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  king for aggrega
2a500 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
2a510 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65  .** for variable
2a520 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
2a530 65 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e  e added to AggIn
2a540 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70  fo object that p
2a550 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20  NC->pAggInfo.** 
2a560 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69  points to.  Addi
2a570 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61  tional entries a
2a580 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41  re made on the A
2a590 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73  ggInfo object as
2a5a0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a  .** necessary..*
2a5b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2a5c0 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
2a5d0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
2a5e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
2a5f0 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
2a600 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f  d by sqlite3Reso
2a610 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a  lveExprNames()..
2a620 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2a630 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2a640 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74  ates(NameContext
2a650 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78   *pNC, Expr *pEx
2a660 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  pr){.  Walker w;
2a670 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
2a680 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
2a690 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2a6a0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2a6b0 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  e;.  w.xSelectCa
2a6c0 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2a6d0 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
2a6e0 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20  ct;.  w.u.pNC = 
2a6f0 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pNC;.  assert( p
2a700 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20  NC->pSrcList!=0 
2a710 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  );.  sqlite3Walk
2a720 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
2a730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
2a740 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2a750 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f  eAggregates() fo
2a760 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
2a770 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72  on in an.** expr
2a780 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65  ession list.  Re
2a790 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
2a7a0 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
2a7b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
2a7c0 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79  found, the analy
2a7d0 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74  sis is cut short
2a7e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a7f0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2a800 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ist(NameContext 
2a810 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a  *pNC, ExprList *
2a820 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74  pList){.  struct
2a830 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2a840 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
2a850 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
2a860 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69     for(pItem=pLi
2a870 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
2a880 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
2a890 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2a8a0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2a8b0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e  yzeAggregates(pN
2a8c0 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  C, pItem->pExpr)
2a8d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2a8e0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
2a8f0 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73  single new regis
2a900 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68  ter for use to h
2a910 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65  old some interme
2a920 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f  diate result..*/
2a930 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
2a940 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
2a950 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61  arse){.  if( pPa
2a960 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30  rse->nTempReg==0
2a970 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b   ){.    return +
2a980 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2a990 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72   }.  return pPar
2a9a0 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70  se->aTempReg[--p
2a9b0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d  Parse->nTempReg]
2a9c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
2a9d0 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72  ocate a register
2a9e0 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62  , making availab
2a9f0 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72  le for reuse for
2aa00 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
2aa10 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  urpose..**.** If
2aa20 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 63   a register is c
2aa30 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75  urrently being u
2aa40 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d  sed by the colum
2aa50 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a  n cache, then.**
2aa60 20 74 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f   the deallocatio
2aa70 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  n is deferred un
2aa80 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  til the column c
2aa90 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75  ache line that u
2aaa0 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ses.** the regis
2aab0 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c  ter becomes stal
2aac0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2aad0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
2aae0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2aaf0 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28  int iReg){.  if(
2ab00 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d   iReg && pParse-
2ab10 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
2ab20 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
2ab30 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74  pReg) ){.    int
2ab40 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79   i;.    struct y
2ab50 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20  ColCache *p;.   
2ab60 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
2ab70 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
2ab80 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
2ab90 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
2aba0 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67       if( p->iReg
2abb0 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
2abc0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31    p->tempReg = 1
2abd0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2abe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2abf0 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
2ac00 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
2ac10 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
2ac20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
2ac30 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
2ac40 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
2ac50 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
2ac60 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69   registers..*/.i
2ac70 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2ac80 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
2ac90 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
2aca0 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
2acb0 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74  f( nReg==1 ) ret
2acc0 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65  urn sqlite3GetTe
2acd0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2ace0 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61   i = pParse->iRa
2acf0 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50  ngeReg;.  n = pP
2ad00 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b  arse->nRangeReg;
2ad10 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29  .  if( nReg<=n )
2ad20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 75  {.    assert( !u
2ad30 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
2ad40 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d  (pParse, i, i+n-
2ad50 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  1) );.    pParse
2ad60 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e  ->iRangeReg += n
2ad70 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
2ad80 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52  >nRangeReg -= nR
2ad90 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eg;.  }else{.   
2ada0 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65   i = pParse->nMe
2adb0 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
2adc0 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20  >nMem += nReg;. 
2add0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
2ade0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
2adf0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61  easeTempRange(Pa
2ae00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2ae10 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
2ae20 7b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20  {.  if( nReg==1 
2ae30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
2ae40 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2ae50 72 73 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  rse, iReg);.    
2ae60 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
2ae70 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
2ae80 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65  move(pParse, iRe
2ae90 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20  g, nReg);.  if( 
2aea0 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61  nReg>pParse->nRa
2aeb0 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50  ngeReg ){.    pP
2aec0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2aed0 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
2aee0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20  se->iRangeReg = 
2aef0 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
2af00 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70  ** Mark all temp
2af10 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
2af20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c  as being unavail
2af30 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a  able for reuse..
2af40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
2af50 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
2af60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2af70 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  .  pParse->nTemp
2af80 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Reg = 0;.  pPars
2af90 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30  e->nRangeReg = 0
2afa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64  ;.}../*.** Valid
2afb0 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70  ate that no temp
2afc0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 66  orary register f
2afd0 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20  alls within the 
2afe0 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72  range of.** iFir
2aff0 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75  st..iLast, inclu
2b000 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74  sive.  This rout
2b010 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
2b020 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73   from within ass
2b030 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65  ert().** stateme
2b040 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nts..*/.#ifdef S
2b050 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
2b060 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e  sqlite3NoTempsIn
2b070 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
2b080 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c  rse, int iFirst,
2b090 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69   int iLast){.  i
2b0a0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72  nt i;.  if( pPar
2b0b0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a  se->nRangeReg>0.
2b0c0 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
2b0d0 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e  angeReg+pParse->
2b0e0 6e 52 61 6e 67 65 52 65 67 3c 69 4c 61 73 74 0a  nRangeReg<iLast.
2b0f0 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
2b100 61 6e 67 65 52 65 67 3e 3d 69 46 69 72 73 74 0a  angeReg>=iFirst.
2b110 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e    ){.     return
2b120 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
2b130 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65  0; i<pParse->nTe
2b140 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  mpReg; i++){.   
2b150 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65   if( pParse->aTe
2b160 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74  mpReg[i]>=iFirst
2b170 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d   && pParse->aTem
2b180 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29  pReg[i]<=iLast )
2b190 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
2b1a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2b1b0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
2b1c0 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
2b1d0 20 2a 2f 0a                                       */.