/ Hex Artifact Content
Login

Artifact 942c417e84e835ce51c6b732afa0b4572110e1c1:


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 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
2f80: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20  p==TK_SELECT.   
2f90: 20 20 7c 7c 20 28 70 56 65 63 74 6f 72 2d 3e 6f    || (pVector->o
2fa0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
2fb0: 26 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d  & pVector->op2==
2fc0: 54 4b 5f 53 45 4c 45 43 54 29 0a 20 20 20 20 29  TK_SELECT).    )
2fd0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
2fe0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
2ff0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
3000: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
3010: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
3020: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3030: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3040: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3050: 70 56 65 63 74 6f 72 3b 0a 7d 0a 23 65 6e 64 69  pVector;.}.#endi
3060: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
3070: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
3080: 52 59 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  RY) */..#ifndef 
3090: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
30a0: 55 45 52 59 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  UERY./*.** Compu
30b0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
30c0: 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74 20  new Expr object 
30d0: 77 68 69 63 68 20 77 68 65 6e 20 70 61 73 73 65  which when passe
30e0: 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45  d to.** sqlite3E
30f0: 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c 20 67  xprCode() will g
3100: 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65 63 65  enerate all nece
3110: 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20 63 6f  ssary code to co
3120: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69 46 69  mpute.** the iFi
3130: 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  eld-th column of
3140: 20 74 68 65 20 76 65 63 74 6f 72 20 65 78 70 72   the vector expr
3150: 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a  ession pVector..
3160: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66  **.** It is ok f
3170: 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  or pVector to be
3180: 20 61 20 73 63 61 6c 61 72 20 28 61 73 20 6c 6f   a scalar (as lo
3190: 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d 30 29  ng as iField==0)
31a0: 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  .  .** In that c
31b0: 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
31c0: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  e works like sql
31d0: 69 74 65 33 45 78 70 72 44 75 70 28 29 2e 0a 2a  ite3ExprDup()..*
31e0: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
31f0: 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72 6e 65  owns the returne
3200: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  d Expr object an
3210: 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  d is responsible
3220: 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67   for.** ensuring
3230: 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
3240: 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74 75 61  ed value eventua
3250: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
3260: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
3270: 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73 68   retains ownersh
3280: 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e 20 20  ip of pVector.  
3290: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
32a0: 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68  TK_SELECT,.** th
32b0: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 20 6f  en the returne o
32c0: 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 66 65 72  bject will refer
32d0: 65 6e 63 65 20 70 56 65 63 74 6f 72 20 61 6e 64  ence pVector and
32e0: 20 73 6f 20 70 56 65 63 74 6f 72 20 6d 75 73 74   so pVector must
32f0: 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69 64   remain.** valid
3300: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 20 6f 66   for the life of
3310: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62   the returned ob
3320: 6a 65 63 74 2e 20 20 49 66 20 70 56 65 63 74 6f  ject.  If pVecto
3330: 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54 4f 52  r is a TK_VECTOR
3340: 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61 72 20  .** or a scalar 
3350: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
3360: 20 69 74 20 63 61 6e 20 62 65 20 64 65 6c 65 74   it can be delet
3370: 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  ed as soon as th
3380: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
3390: 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  turns..**.** A t
33a0: 72 69 63 6b 20 74 6f 20 63 61 75 73 65 20 61 20  rick to cause a 
33b0: 54 4b 5f 53 45 4c 45 43 54 20 70 56 65 63 74 6f  TK_SELECT pVecto
33c0: 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  r to be deleted 
33d0: 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a 2a  together with.**
33e0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45 78   the returned Ex
33f0: 70 72 20 6f 62 6a 65 63 74 20 69 73 20 74 6f 20  pr object is to 
3400: 61 74 74 61 63 68 20 74 68 65 20 70 56 65 63 74  attach the pVect
3410: 6f 72 20 74 6f 20 74 68 65 20 70 52 69 67 68 74  or to the pRight
3420: 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65   field.** of the
3430: 20 72 65 74 75 72 6e 65 64 20 54 4b 5f 53 45 4c   returned TK_SEL
3440: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
3450: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72 20  object..*/.Expr 
3460: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56  *sqlite3ExprForV
3470: 65 63 74 6f 72 46 69 65 6c 64 28 0a 20 20 50 61  ectorField(.  Pa
3480: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3490: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
34a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
34b0: 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20  *pVector,       
34c0: 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 2e 20 20  /* The vector.  
34d0: 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  List of expressi
34e0: 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d 53 45 4c  ons or a sub-SEL
34f0: 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ECT */.  int iFi
3500: 65 6c 64 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eld           /*
3510: 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   Which column of
3520: 20 74 68 65 20 76 65 63 74 6f 72 20 74 6f 20 72   the vector to r
3530: 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78  eturn */.){.  Ex
3540: 70 72 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  pr *pRet;.  if( 
3550: 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f  pVector->op==TK_
3560: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73  SELECT ){.    as
3570: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 66  sert( pVector->f
3580: 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
3590: 65 63 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  ect );.    /* Th
35a0: 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  e TK_SELECT_COLU
35b0: 4d 4e 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20 20  MN Expr node:.  
35c0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65 66    **.    ** pLef
35d0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 70 56 65  t:           pVe
35e0: 63 74 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ctor containing 
35f0: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  TK_SELECT.    **
3600: 20 70 52 69 67 68 74 3a 20 20 20 20 20 20 20 20   pRight:        
3610: 20 20 6e 6f 74 20 75 73 65 64 2e 20 20 42 75 74    not used.  But
3620: 20 72 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   recursively del
3630: 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f  eted..    ** iCo
3640: 6c 75 6d 6e 3a 20 20 20 20 20 20 20 20 20 49 6e  lumn:         In
3650: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
3660: 69 6e 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a  in pVector.    *
3670: 2a 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a  * pLeft->iTable:
3680: 20 20 20 46 69 72 73 74 20 69 6e 20 61 6e 20 61     First in an a
3690: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
36a0: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c   holding result,
36b0: 20 6f 72 20 30 0a 20 20 20 20 2a 2a 20 20 20 20   or 0.    **    
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
36d0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e   the result is n
36e0: 6f 74 20 79 65 74 20 63 6f 6d 70 75 74 65 64 2e  ot yet computed.
36f0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
3700: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3710: 28 29 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20  () specifically 
3720: 73 6b 69 70 73 20 74 68 65 20 72 65 63 75 72 73  skips the recurs
3730: 69 76 65 20 64 65 6c 65 74 65 20 6f 66 0a 20 20  ive delete of.  
3740: 20 20 2a 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b    ** pLeft on TK
3750: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e  _SELECT_COLUMN n
3760: 6f 64 65 73 2e 20 20 42 75 74 20 70 52 69 67 68  odes.  But pRigh
3770: 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73  t is followed, s
3780: 6f 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a  o pVector.    **
3790: 20 63 61 6e 20 62 65 20 61 74 74 61 63 68 65 64   can be attached
37a0: 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 63 61   to pRight to ca
37b0: 75 73 65 20 74 68 69 73 20 6e 6f 64 65 20 74 6f  use this node to
37c0: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
37d0: 6f 66 0a 20 20 20 20 2a 2a 20 70 56 65 63 74 6f  of.    ** pVecto
37e0: 72 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68  r.  Typically th
37f0: 65 72 65 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74  ere will be mult
3800: 69 70 6c 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43  iple TK_SELECT_C
3810: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20  OLUMN nodes.    
3820: 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
3830: 20 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 20 74   pLeft pointer t
3840: 6f 20 74 68 65 20 70 56 65 63 74 6f 72 2c 20 62  o the pVector, b
3850: 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74  ut only one of t
3860: 68 65 6d 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  hem.    ** will 
3870: 6f 77 6e 20 74 68 65 20 70 56 65 63 74 6f 72 2e  own the pVector.
3880: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 52 65 74  .    */.    pRet
3890: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
38a0: 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43  pParse, TK_SELEC
38b0: 54 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c 20  T_COLUMN, 0, 0, 
38c0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74  0);.    if( pRet
38d0: 20 29 7b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   ){.      pRet->
38e0: 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69 65 6c 64  iColumn = iField
38f0: 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 70 4c  ;.      pRet->pL
3900: 65 66 74 20 3d 20 70 56 65 63 74 6f 72 3b 0a 20  eft = pVector;. 
3910: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
3920: 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70 52 65 74   pRet==0 || pRet
3930: 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  ->iTable==0 );. 
3940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
3950: 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f  pVector->op==TK_
3960: 56 45 43 54 4f 52 20 29 20 70 56 65 63 74 6f 72  VECTOR ) pVector
3970: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c   = pVector->x.pL
3980: 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70  ist->a[iField].p
3990: 45 78 70 72 3b 0a 20 20 20 20 70 52 65 74 20 3d  Expr;.    pRet =
39a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
39b0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 56 65 63  pParse->db, pVec
39c0: 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  tor, 0);.  }.  r
39d0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
39e0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 28  ndif /* !define(
39f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3a00: 55 45 52 59 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UERY) */../*.** 
3a10: 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  If expression pE
3a20: 78 70 72 20 69 73 20 6f 66 20 74 79 70 65 20 54  xpr is of type T
3a30: 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61  K_SELECT, genera
3a40: 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
3a50: 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75 72  ate.** it. Retur
3a60: 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  n the register i
3a70: 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75  n which the resu
3a80: 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28 6f 72  lt is stored (or
3a90: 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62  , if the .** sub
3aa0: 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
3ab0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f  more than one co
3ac0: 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73 74 20  lumn, the first 
3ad0: 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20 6f  in an array.** o
3ae0: 66 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 77  f registers in w
3af0: 68 69 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  hich the result 
3b00: 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a  is stored)..**.*
3b10: 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 6e 6f  * If pExpr is no
3b20: 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78  t a TK_SELECT ex
3b30: 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e  pression, return
3b40: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
3b50: 74 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c  t exprCodeSubsel
3b60: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
3b70: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
3b80: 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30 3b 0a  .  int reg = 0;.
3b90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3ba0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
3bb0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
3bc0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72  _SELECT ){.    r
3bd0: 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  eg = sqlite3Code
3be0: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
3bf0: 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a  , pExpr, 0, 0);.
3c00: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
3c10: 75 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn reg;.}../*.*
3c20: 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 65 63 74  * Argument pVect
3c30: 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76  or points to a v
3c40: 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
3c50: 20 2d 20 65 69 74 68 65 72 20 61 20 54 4b 5f 56   - either a TK_V
3c60: 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53  ECTOR.** or TK_S
3c70: 45 4c 45 43 54 20 74 68 61 74 20 72 65 74 75 72  ELECT that retur
3c80: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ns more than one
3c90: 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 66 75   column. This fu
3ca0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a  nction returns.*
3cb0: 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  * the register n
3cc0: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 69 73  umber of a regis
3cd0: 74 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ter that contain
3ce0: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  s the value of.*
3cf0: 2a 20 65 6c 65 6d 65 6e 74 20 69 46 69 65 6c 64  * element iField
3d00: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a   of the vector..
3d10: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
3d20: 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 20   is a TK_SELECT 
3d30: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
3d40: 20 63 6f 64 65 20 66 6f 72 20 69 74 20 6d 75 73   code for it mus
3d50: 74 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72 65 61  t have .** alrea
3d60: 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  dy been generate
3d70: 64 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72  d using the expr
3d80: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 29 20  CodeSubselect() 
3d90: 72 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68 69 73  routine. In this
3da0: 0a 2a 2a 20 63 61 73 65 20 70 61 72 61 6d 65 74  .** case paramet
3db0: 65 72 20 72 65 67 53 65 6c 65 63 74 20 73 68 6f  er regSelect sho
3dc0: 75 6c 64 20 62 65 20 74 68 65 20 66 69 72 73 74  uld be the first
3dd0: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
3de0: 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 63 6f 6e  registers.** con
3df0: 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  taining the resu
3e00: 6c 74 73 20 6f 66 20 74 68 65 20 73 75 62 2d 73  lts of the sub-s
3e10: 65 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  elect. .**.** If
3e20: 20 70 56 65 63 74 6f 72 20 69 73 20 6f 66 20 74   pVector is of t
3e30: 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c 20 74  ype TK_VECTOR, t
3e40: 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 65  hen code for the
3e50: 20 72 65 71 75 65 73 74 65 64 20 66 69 65 6c 64   requested field
3e60: 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64  .** is generated
3e70: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28  . In this case (
3e80: 2a 70 52 65 67 46 72 65 65 29 20 6d 61 79 20 62  *pRegFree) may b
3e90: 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  e set to the num
3ea0: 62 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70  ber of.** a temp
3eb0: 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
3ec0: 6f 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  o be freed by th
3ed0: 65 20 63 61 6c 6c 65 72 20 62 65 66 6f 72 65 20  e caller before 
3ee0: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
3ef0: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
3f00: 67 2c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  g, output parame
3f10: 74 65 72 20 28 2a 70 70 45 78 70 72 29 20 69 73  ter (*ppExpr) is
3f20: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
3f30: 20 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f 62 6a   the.** Expr obj
3f40: 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
3f50: 67 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69 45 6c  g to element iEl
3f60: 65 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  em of the vector
3f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3f80: 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74  exprVectorRegist
3f90: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
3fa0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
3fb0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
3fc0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
3fd0: 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20   *pVector,      
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
3ff0: 65 63 74 6f 72 20 74 6f 20 65 78 74 72 61 63 74  ector to extract
4000: 20 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f   element from */
4010: 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 2c 20 20  .  int iField,  
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4030: 20 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f 20 65     /* Field to e
4040: 78 74 72 61 63 74 20 66 72 6f 6d 20 70 56 65 63  xtract from pVec
4050: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  tor */.  int reg
4060: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 20  Select,         
4070: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4080: 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65  t in array of re
4090: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 45 78 70  gisters */.  Exp
40a0: 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20  r **ppExpr,     
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40c0: 4f 55 54 3a 20 45 78 70 72 65 73 73 69 6f 6e 20  OUT: Expression 
40d0: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
40e0: 20 2a 70 52 65 67 46 72 65 65 20 20 20 20 20 20   *pRegFree      
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4100: 4f 55 54 3a 20 54 65 6d 70 20 72 65 67 69 73 74  OUT: Temp regist
4110: 65 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a 29 7b  er to free */.){
4120: 0a 20 20 75 38 20 6f 70 20 3d 20 70 56 65 63 74  .  u8 op = pVect
4130: 6f 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65 72 74  or->op;.  assert
4140: 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20  ( op==TK_VECTOR 
4150: 7c 7c 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  || op==TK_SELECT
4160: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53   || op==TK_REGIS
4170: 54 45 52 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d  TER );.  if( op=
4180: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
4190: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71      *ppExpr = sq
41a0: 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
41b0: 53 75 62 65 78 70 72 28 70 56 65 63 74 6f 72 2c  Subexpr(pVector,
41c0: 20 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 72 65   iField);.    re
41d0: 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 69 54  turn pVector->iT
41e0: 61 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20 20 7d  able+iField;.  }
41f0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
4200: 4c 45 43 54 20 29 7b 0a 20 20 20 20 2a 70 70 45  LECT ){.    *ppE
4210: 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  xpr = pVector->x
4220: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
4230: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
4240: 72 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 72  r;.     return r
4250: 65 67 53 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b  egSelect+iField;
4260: 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d  .  }.  *ppExpr =
4270: 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73   pVector->x.pLis
4280: 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78  t->a[iField].pEx
4290: 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  pr;.  return sql
42a0: 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
42b0: 28 70 50 61 72 73 65 2c 20 2a 70 70 45 78 70 72  (pParse, *ppExpr
42c0: 2c 20 70 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a  , pRegFree);.}..
42d0: 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e  /*.** Expression
42e0: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
42f0: 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 74  arison between t
4300: 77 6f 20 76 65 63 74 6f 72 20 76 61 6c 75 65 73  wo vector values
4310: 2e 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  . Compute.** the
4320: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63   result of the c
4330: 6f 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20 30 2c  omparison (1, 0,
4340: 20 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20 77 72   or NULL) and wr
4350: 69 74 65 20 74 68 61 74 0a 2a 2a 20 72 65 73 75  ite that.** resu
4360: 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  lt into register
4370: 20 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   dest..**.** The
4380: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 73 61 74   caller must sat
4390: 69 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  isfy the followi
43a0: 6e 67 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73  ng preconditions
43b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20 70 45  :.**.**    if pE
43c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20  xpr->op==TK_IS: 
43d0: 20 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51 20 61       op==TK_EQ a
43e0: 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55  nd p5==SQLITE_NU
43f0: 4c 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20 70 45  LLEQ.**    if pE
4400: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4410: 54 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61  T:   op==TK_NE a
4420: 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55  nd p5==SQLITE_NU
4430: 4c 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68 65 72  LLEQ.**    other
4440: 77 69 73 65 3a 20 20 20 20 20 20 20 20 20 20 20  wise:           
4450: 20 20 20 20 20 6f 70 3d 3d 70 45 78 70 72 2d 3e       op==pExpr->
4460: 6f 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a  op and p5==0.*/.
4470: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
4480: 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 0a 20  VectorCompare(. 
4490: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
44a0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 67         /* Code g
44b0: 65 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65 78 74  enerator context
44c0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
44d0: 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
44e0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
44f0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
4500: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 20   dest,          
4510: 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
4520: 6c 74 73 20 69 6e 74 6f 20 74 68 69 73 20 72 65  lts into this re
4530: 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f  gister */.  u8 o
4540: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4550: 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
4560: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38  operator */.  u8
4570: 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20 20   p5             
4580: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55      /* SQLITE_NU
4590: 4c 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a  LLEQ or zero */.
45a0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
45b0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
45c0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
45d0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78  xpr->pLeft;.  Ex
45e0: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
45f0: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 69 6e  pr->pRight;.  in
4600: 74 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  t nLeft = sqlite
4610: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
4620: 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b  pLeft);.  int i;
4630: 0a 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20 3d  .  int regLeft =
4640: 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 52 69 67   0;.  int regRig
4650: 68 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f 70 78  ht = 0;.  u8 opx
4660: 20 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64   = op;.  int add
4670: 72 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56  rDone = sqlite3V
4680: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
4690: 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 65 66  ..  assert( nLef
46a0: 74 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65  t==sqlite3ExprVe
46b0: 63 74 6f 72 53 69 7a 65 28 70 52 69 67 68 74 29  ctorSize(pRight)
46c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
46d0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
46e0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
46f0: 4e 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45  NE .       || pE
4700: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
4710: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4720: 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20 7c 7c  ISNOT .       ||
4730: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
4740: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
4750: 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20 7c 7c  TK_GT .       ||
4760: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
4770: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
4780: 54 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20 61 73  TK_GE .  );.  as
4790: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
47a0: 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f  =op || (pExpr->o
47b0: 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d  p==TK_IS && op==
47c0: 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20  TK_EQ).         
47d0: 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70     || (pExpr->op
47e0: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20 6f 70  ==TK_ISNOT && op
47f0: 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20 61 73  ==TK_NE) );.  as
4800: 73 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70  sert( p5==0 || p
4810: 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a  Expr->op!=op );.
4820: 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51    assert( p5==SQ
4830: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70  LITE_NULLEQ || p
4840: 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a  Expr->op==op );.
4850: 0a 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f  .  p5 |= SQLITE_
4860: 53 54 4f 52 45 50 32 3b 0a 20 20 69 66 28 20 6f  STOREP2;.  if( o
4870: 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20  px==TK_LE ) opx 
4880: 3d 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28 20 6f  = TK_LT;.  if( o
4890: 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20  px==TK_GE ) opx 
48a0: 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65 67 4c  = TK_GT;..  regL
48b0: 65 66 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75  eft = exprCodeSu
48c0: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
48d0: 70 4c 65 66 74 29 3b 0a 20 20 72 65 67 52 69 67  pLeft);.  regRig
48e0: 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62  ht = exprCodeSub
48f0: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
4900: 52 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72 28 69  Right);..  for(i
4910: 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65 78 69  =0; 1 /*Loop exi
4920: 74 73 20 62 79 20 22 62 72 65 61 6b 22 2a 2f 3b  ts by "break"*/;
4930: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   i++){.    int r
4940: 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67  egFree1 = 0, reg
4950: 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 45  Free2 = 0;.    E
4960: 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20  xpr *pL, *pR; . 
4970: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20     int r1, r2;. 
4980: 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
4990: 26 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20  && i<nLeft );.  
49a0: 20 20 69 66 28 20 69 3e 30 20 29 20 73 71 6c 69    if( i>0 ) sqli
49b0: 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
49c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 31  (pParse);.    r1
49d0: 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67   = exprVectorReg
49e0: 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c  ister(pParse, pL
49f0: 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c  eft, i, regLeft,
4a00: 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29   &pL, &regFree1)
4a10: 3b 0a 20 20 20 20 72 32 20 3d 20 65 78 70 72 56  ;.    r2 = exprV
4a20: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50  ectorRegister(pP
4a30: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69 2c  arse, pRight, i,
4a40: 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c 20   regRight, &pR, 
4a50: 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
4a60: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
4a70: 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c  se, pL, pR, opx,
4a80: 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 70   r1, r2, dest, p
4a90: 35 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  5);.    testcase
4aa0: 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
4ab0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4ac0: 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65  ==OP_Lt);.    te
4ad0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
4ae0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4af0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
4b00: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4b10: 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
4b20: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4b30: 5f 47 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Gt);.    testca
4b40: 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
4b50: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4b60: 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
4b70: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4b80: 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
4b90: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
4ba0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4bb0: 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
4bc0: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4bd0: 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69  OP_Ne);.    sqli
4be0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4bf0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
4c00: 65 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e1);.    sqlite3
4c10: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
4c20: 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
4c30: 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 20  ;.    if( i>0 ) 
4c40: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
4c50: 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
4c60: 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 31 20   if( i==nLeft-1 
4c70: 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
4c80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
4c90: 78 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20  x==TK_EQ ){.    
4ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4cb0: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op2(v, OP_IfNot,
4cc0: 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29   dest, addrDone)
4cd0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4ce0: 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d 20 53  );.      p5 |= S
4cf0: 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a  QLITE_KEEPNULL;.
4d00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
4d10: 78 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20 20 20 20  x==TK_NE ){.    
4d20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d30: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 64 65  Op2(v, OP_If, de
4d40: 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56  st, addrDone); V
4d50: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4d60: 20 20 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49        p5 |= SQLI
4d70: 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20  TE_KEEPNULL;.   
4d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
4d90: 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20  sert( op==TK_LT 
4da0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20  || op==TK_GT || 
4db0: 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op==TK_LE || op=
4dc0: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
4dd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4de0: 32 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45  2(v, OP_ElseNotE
4df0: 71 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b  q, 0, addrDone);
4e00: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
4e10: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
4e20: 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LT);.      VdbeC
4e30: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
4e40: 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56  =TK_GT);.      V
4e50: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4e60: 20 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20   op==TK_LE);.   
4e70: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
4e80: 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 45 29 3b  f(v, op==TK_GE);
4e90: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c  .      if( i==nL
4ea0: 65 66 74 2d 32 20 29 20 6f 70 78 20 3d 20 6f 70  eft-2 ) opx = op
4eb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
4ec0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
4ed0: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e  Label(v, addrDon
4ee0: 65 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  e);.}..#if SQLIT
4ef0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
4f00: 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  >0./*.** Check t
4f10: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65  hat argument nHe
4f20: 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61  ight is less tha
4f30: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
4f40: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70  e maximum.** exp
4f50: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c  ression depth al
4f60: 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20  lowed. If it is 
4f70: 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  not, leave an er
4f80: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a  ror message in.*
4f90: 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74  * pParse..*/.int
4fa0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
4fb0: 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  kHeight(Parse *p
4fc0: 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67  Parse, int nHeig
4fd0: 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ht){.  int rc = 
4fe0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
4ff0: 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72   mxHeight = pPar
5000: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
5010: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
5020: 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e  _DEPTH];.  if( n
5030: 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20  Height>mxHeight 
5040: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5050: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
5060: 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69         "Expressi
5070: 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c  on tree is too l
5080: 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65  arge (maximum de
5090: 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67  pth %d)", mxHeig
50a0: 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  ht.    );.    rc
50b0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
50c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
50d0: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;.}../* The foll
50e0: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
50f0: 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45  tions, heightOfE
5100: 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45  xpr(), heightOfE
5110: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64  xprList().** and
5120: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5130: 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  ), are used to d
5140: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
5150: 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f  imum height.** o
5160: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
5170: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
5180: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
5190: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
51a0: 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
51b0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
51c0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
51d0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
51e0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
51f0: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
5200: 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65  by pnHeight, the
5210: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
5220: 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48  r, then set *pnH
5230: 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a  eight to that.**
5240: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
5250: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
5260: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
5270: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
5280: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
5290: 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65  p->nHeight>*pnHe
52a0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  ight ){.      *p
52b0: 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65  nHeight = p->nHe
52c0: 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
52d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
52e0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45  ightOfExprList(E
52f0: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
5300: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
5310: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
5320: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5330: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  <p->nExpr; i++){
5340: 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45  .      heightOfE
5350: 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70  xpr(p->a[i].pExp
5360: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
5370: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
5380: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65   void heightOfSe
5390: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
53a0: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
53b0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68    if( p ){.    h
53c0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
53d0: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
53e0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
53f0: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
5400: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5410: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5420: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
5430: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5440: 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e  r(p->pOffset, pn
5450: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5460: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
5470: 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68  >pEList, pnHeigh
5480: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5490: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
54a0: 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  upBy, pnHeight);
54b0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
54c0: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
54d0: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
54e0: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
54f0: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65  (p->pPrior, pnHe
5500: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
5510: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
5520: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
5530: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
5540: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
5550: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
5560: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
5570: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
5580: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
5590: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
55a0: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
55b0: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
55c0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
55d0: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
55e0: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
55f0: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
5600: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
5610: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
5620: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72  e..**.** Also pr
5630: 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61  opagate EP_Propa
5640: 67 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72  gate flags up fr
5650: 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  om Expr.x.pList 
5660: 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a  to Expr.flags,.*
5670: 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65  * if appropriate
5680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5690: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45   exprSetHeight(E
56a0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  xpr *p){.  int n
56b0: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
56c0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
56d0: 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  eft, &nHeight);.
56e0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
56f0: 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67  ->pRight, &nHeig
5700: 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ht);.  if( ExprH
5710: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5720: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
5730: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
5740: 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  t(p->x.pSelect, 
5750: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c  &nHeight);.  }el
5760: 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73  se if( p->x.pLis
5770: 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  t ){.    heightO
5780: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70  fExprList(p->x.p
5790: 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  List, &nHeight);
57a0: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
57b0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
57c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
57d0: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
57e0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67  ;.  }.  p->nHeig
57f0: 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31  ht = nHeight + 1
5800: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
5810: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
5820: 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74  variable using t
5830: 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  he exprSetHeight
5840: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a  () function. If.
5850: 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73  ** the height is
5860: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
5870: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5880: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  d expression dep
5890: 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  th,.** leave an 
58a0: 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
58b0: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
58c0: 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f  agate all EP_Pro
58d0: 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f  pagate flags fro
58e0: 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69  m the Expr.x.pLi
58f0: 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e  st into.** Expr.
5900: 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20  flags. .*/.void 
5910: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
5920: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72  ightAndFlags(Par
5930: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
5940: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72   *p){.  if( pPar
5950: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
5960: 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67  n;.  exprSetHeig
5970: 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ht(p);.  sqlite3
5980: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
5990: 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67  pParse, p->nHeig
59a0: 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ht);.}../*.** Re
59b0: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
59c0: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65   height of any e
59d0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
59e0: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20  eferenced.** by 
59f0: 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  the select state
5a00: 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61  ment passed as a
5a10: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  n argument..*/.i
5a20: 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
5a30: 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63  ExprHeight(Selec
5a40: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  t *p){.  int nHe
5a50: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5a60: 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e  htOfSelect(p, &n
5a70: 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72  Height);.  retur
5a80: 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c  n nHeight;.}.#el
5a90: 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65  se /* ABOVE:  He
5aa0: 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  ight enforcement
5ab0: 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57   enabled.  BELOW
5ac0: 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65  : Height enforce
5ad0: 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a  ment off */./*.*
5ae0: 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20  * Propagate all 
5af0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
5b00: 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  gs from the Expr
5b10: 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a  .x.pList into.**
5b20: 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f   Expr.flags. .*/
5b30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
5b40: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
5b50: 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
5b60: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
5b70: 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73  ( p && p->x.pLis
5b80: 74 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  t && !ExprHasPro
5b90: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
5ba0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d  elect) ){.    p-
5bb0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f  >flags |= EP_Pro
5bc0: 70 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33  pagate & sqlite3
5bd0: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d  ExprListFlags(p-
5be0: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  >x.pList);.  }.}
5bf0: 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74  .#define exprSet
5c00: 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66  Height(y).#endif
5c10: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45   /* SQLITE_MAX_E
5c20: 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a  XPR_DEPTH>0 */..
5c30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5c40: 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61  ne is the core a
5c50: 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70  llocator for Exp
5c60: 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43  r nodes..**.** C
5c70: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
5c80: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
5c90: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
5ca0: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
5cb0: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
5cc0: 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20  ode and for the 
5cd0: 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20  pToken argument 
5ce0: 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  is a single allo
5cf0: 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e  cation.** obtain
5d00: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
5d10: 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  bMalloc().  The 
5d20: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
5d30: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
5d40: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
5d50: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
5d60: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
5d70: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75  d..**.** If dequ
5d80: 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ote is true, the
5d90: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20  n the token (if 
5da0: 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65  it exists) is de
5db0: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65  quoted..** If de
5dc0: 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20  quote is false, 
5dd0: 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20  no dequoting is 
5de0: 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20  performed.  The 
5df0: 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d  deQuote.** param
5e00: 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
5e10: 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
5e20: 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65  L or if the toke
5e30: 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70  n does not.** ap
5e40: 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65  pear to be quote
5e50: 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65  d.  If the quote
5e60: 73 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f  s were of the fo
5e70: 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65  rm "..." (double
5e80: 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e  -quotes).** then
5e90: 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65   the EP_DblQuote
5ea0: 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  d flag is set on
5eb0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5ec0: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63  node..**.** Spec
5ed0: 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70  ial case:  If op
5ee0: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64  ==TK_INTEGER and
5ef0: 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74   pToken points t
5f00: 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a  o a string that.
5f10: 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c  ** can be transl
5f20: 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62  ated into a 32-b
5f30: 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  it integer, then
5f40: 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f   the token is no
5f50: 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75  t.** stored in u
5f60: 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61  .zToken.  Instea
5f70: 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  d, the integer v
5f80: 61 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e  alues is written
5f90: 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75  .** into u.iValu
5fa0: 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74  e and the EP_Int
5fb0: 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65  Value flag is se
5fc0: 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f  t.  No extra sto
5fd0: 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63  rage.** is alloc
5fe0: 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
5ff0: 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e   integer text an
6000: 64 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c  d the dequote fl
6010: 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ag is ignored..*
6020: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
6030: 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69  xprAlloc(.  sqli
6040: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
6050: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
6060: 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  r sqlite3DbMallo
6070: 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20  cZero() (may be 
6080: 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  null) */.  int o
6090: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
60a0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
60b0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e   opcode */.  con
60c0: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  st Token *pToken
60d0: 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72  ,    /* Token ar
60e0: 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  gument.  Might b
60f0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
6100: 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20  dequote         
6110: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64      /* True to d
6120: 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45  equote */.){.  E
6130: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  xpr *pNew;.  int
6140: 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69   nExtra = 0;.  i
6150: 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a  nt iValue = 0;..
6160: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
6170: 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  );.  if( pToken 
6180: 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54  ){.    if( op!=T
6190: 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54 6f  K_INTEGER || pTo
61a0: 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20 20  ken->z==0.      
61b0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65      || sqlite3Ge
61c0: 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a  tInt32(pToken->z
61d0: 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b  , &iValue)==0 ){
61e0: 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d 20  .      nExtra = 
61f0: 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20  pToken->n+1;.   
6200: 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c 75     assert( iValu
6210: 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  e>=0 );.    }.  
6220: 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  }.  pNew = sqlit
6230: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
6240: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29  db, sizeof(Expr)
6250: 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20  +nExtra);.  if( 
6260: 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d 73  pNew ){.    mems
6270: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
6280: 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 70  of(Expr));.    p
6290: 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  New->op = (u8)op
62a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67 67  ;.    pNew->iAgg
62b0: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70   = -1;.    if( p
62c0: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  Token ){.      i
62d0: 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a  f( nExtra==0 ){.
62e0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
62f0: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
6300: 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
6310: 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56 61  ->u.iValue = iVa
6320: 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lue;.      }else
6330: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
6340: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
6350: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20  *)&pNew[1];.    
6360: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
6370: 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b  en->z!=0 || pTok
6380: 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  en->n==0 );.    
6390: 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e      if( pToken->
63a0: 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  n ) memcpy(pNew-
63b0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65  >u.zToken, pToke
63c0: 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29  n->z, pToken->n)
63d0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
63e0: 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d  u.zToken[pToken-
63f0: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  >n] = 0;.       
6400: 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20   if( dequote && 
6410: 73 71 6c 69 74 65 33 49 73 71 75 6f 74 65 28 70  sqlite3Isquote(p
6420: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  New->u.zToken[0]
6430: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
6440: 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  f( pNew->u.zToke
6450: 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70 4e 65 77  n[0]=='"' ) pNew
6460: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62  ->flags |= EP_Db
6470: 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20 20  lQuoted;.       
6480: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
6490: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
64a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
64b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53     }.    }.#if S
64c0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
64d0: 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d  EPTH>0.    pNew-
64e0: 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23 65  >nHeight = 1;.#e
64f0: 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65 74  ndif  .  }.  ret
6500: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
6510: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
6520: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
6530: 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65  e from a zero-te
6540: 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74  rminated token t
6550: 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61  hat has.** alrea
6560: 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65 64  dy been dequoted
6570: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
6580: 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65  e3Expr(.  sqlite
6590: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
65a0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
65b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
65c0: 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75  ero() (may be nu
65d0: 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ll) */.  int op,
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
6600: 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pcode */.  const
6610: 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20   char *zToken   
6620: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75     /* Token argu
6630: 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20  ment.  Might be 
6640: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b  NULL */.){.  Tok
6650: 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54  en x;.  x.z = zT
6660: 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a 54  oken;.  x.n = zT
6670: 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33 53 74  oken ? sqlite3St
6680: 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20 3a  rlen30(zToken) :
6690: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   0;.  return sql
66a0: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
66b0: 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a  , op, &x, 0);.}.
66c0: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75  ./*.** Attach su
66d0: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
66e0: 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20 45   pRight to the E
66f0: 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a  xpr node pRoot..
6700: 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d  **.** If pRoot==
6710: 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
6720: 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c  that a memory al
6730: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
6740: 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  as occurred..** 
6750: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 65  In that case, de
6760: 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65 65  lete the subtree
6770: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
6780: 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ht..*/.void sqli
6790: 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62  te3ExprAttachSub
67a0: 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33  trees(.  sqlite3
67b0: 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52   *db,.  Expr *pR
67c0: 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65  oot,.  Expr *pLe
67d0: 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft,.  Expr *pRig
67e0: 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f  ht.){.  if( pRoo
67f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  t==0 ){.    asse
6800: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
6810: 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  iled );.    sqli
6820: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6830: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  , pLeft);.    sq
6840: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6850: 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  db, pRight);.  }
6860: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52  else{.    if( pR
6870: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52  ight ){.      pR
6880: 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52  oot->pRight = pR
6890: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  ight;.      pRoo
68a0: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
68b0: 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67 68  ropagate & pRigh
68c0: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
68d0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
68e0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
68f0: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
6900: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
6910: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
6920: 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a  & pLeft->flags;.
6930: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
6940: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
6950: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6960: 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f  ocate an Expr no
6970: 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61  de which joins a
6980: 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75  s many as two su
6990: 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  btrees..**.** On
69a0: 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
69b0: 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65   subtrees can be
69c0: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61   NULL.  Return a
69d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
69e0: 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65  new.** Expr node
69f0: 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d  .  Or, if an OOM
6a00: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
6a10: 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  et pParse->db->m
6a20: 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20  allocFailed,.** 
6a30: 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65  free the subtree
6a40: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
6a50: 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  L..*/.Expr *sqli
6a60: 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73  te3PExpr(.  Pars
6a70: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6a80: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6a90: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
6aa0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6ab0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6ac0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
6ad0: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
6ae0: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
6af0: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
6b00: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  *pRight,        
6b10: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
6b20: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  and */.  const T
6b30: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20  oken *pToken    
6b40: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b   /* Argument tok
6b50: 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  en */.){.  Expr 
6b60: 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  *p;.  if( op==TK
6b70: 5f 41 4e 44 20 26 26 20 70 50 61 72 73 65 2d 3e  _AND && pParse->
6b80: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nErr==0 ){.    /
6b90: 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65  * Take advantage
6ba0: 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69   of short-circui
6bb0: 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61  t false optimiza
6bc0: 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a  tion for AND */.
6bd0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45      p = sqlite3E
6be0: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
6bf0: 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  b, pLeft, pRight
6c00: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6c10: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  p = sqlite3ExprA
6c20: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
6c30: 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b   op & TKFLG_MASK
6c40: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
6c50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
6c60: 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72  achSubtrees(pPar
6c70: 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74  se->db, p, pLeft
6c80: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  , pRight);.  }. 
6c90: 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73   if( p ) {.    s
6ca0: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
6cb0: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
6cc0: 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20  >nHeight);.  }. 
6cd0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
6ce0: 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20  .** Add pSelect 
6cf0: 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53  to the Expr.x.pS
6d00: 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72  elect field.  Or
6d10: 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 4e 55  , if pExpr is NU
6d20: 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20  LL (due.** do a 
6d30: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
6d40: 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20  n failure) then 
6d50: 64 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65  delete the pSele
6d60: 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  ct object..*/.vo
6d70: 69 64 20 73 71 6c 69 74 65 33 50 45 78 70 72 41  id sqlite3PExprA
6d80: 64 64 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ddSelect(Parse *
6d90: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
6da0: 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  xpr, Select *pSe
6db0: 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78  lect){.  if( pEx
6dc0: 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d  pr ){.    pExpr-
6dd0: 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65  >x.pSelect = pSe
6de0: 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65  lect;.    ExprSe
6df0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
6e00: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50   EP_xIsSelect|EP
6e10: 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20  _Subquery);.    
6e20: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
6e30: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
6e40: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d  rse, pExpr);.  }
6e50: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
6e60: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
6e70: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6e80: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
6e90: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
6ea0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a  , pSelect);.  }.
6eb0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
6ec0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
6ed0: 6c 77 61 79 73 20 65 69 74 68 65 72 20 54 52 55  lways either TRU
6ee0: 45 20 6f 72 20 46 41 4c 53 45 20 28 72 65 73 70  E or FALSE (resp
6ef0: 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20 74 68  ectively),.** th
6f00: 65 6e 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  en return 1.  If
6f10: 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65 74 65   one cannot dete
6f20: 72 6d 69 6e 65 20 74 68 65 20 74 72 75 74 68 20  rmine the truth 
6f30: 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
6f40: 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 63 6f  expression at co
6f50: 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65 74 75 72  mpile-time retur
6f60: 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  n 0..**.** This 
6f70: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
6f80: 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74 6f  on.  If is OK to
6f90: 20 72 65 74 75 72 6e 20 30 20 68 65 72 65 20 65   return 0 here e
6fa0: 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 65 78  ven if.** the ex
6fb0: 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79 20  pression really 
6fc0: 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20  is always false 
6fd0: 6f 72 20 66 61 6c 73 65 20 28 61 20 66 61 6c 73  or false (a fals
6fe0: 65 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a 2a 20  e negative)..** 
6ff0: 42 75 74 20 69 74 20 69 73 20 61 20 62 75 67 20  But it is a bug 
7000: 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66 20 74  to return 1 if t
7010: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
7020: 67 68 74 20 68 61 76 65 20 64 69 66 66 65 72 65  ght have differe
7030: 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61  nt.** boolean va
7040: 6c 75 65 73 20 69 6e 20 64 69 66 66 65 72 65 6e  lues in differen
7050: 74 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 20  t circumstances 
7060: 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76  (a false positiv
7070: 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  e.).**.** Note t
7080: 68 61 74 20 69 66 20 74 68 65 20 65 78 70 72 65  hat if the expre
7090: 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ssion is part of
70a0: 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f 72   conditional for
70b0: 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c   a.** LEFT JOIN,
70c0: 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20   then we cannot 
70d0: 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f 6d  determine at com
70e0: 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65  pile-time whethe
70f0: 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20 69  r or not.** is i
7100: 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 2c  t true or false,
7110: 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72   so always retur
7120: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
7130: 6e 74 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  nt exprAlwaysTru
7140: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
7150: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
7160: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7170: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
7180: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7190: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
71a0: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
71b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
71c0: 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61 74 69  rn v!=0;.}.stati
71d0: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
71e0: 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b 0a  False(Expr *p){.
71f0: 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69    int v = 0;.  i
7200: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
7210: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
7220: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
7230: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
7240: 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76  rIsInteger(p, &v
7250: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
7260: 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a  return v==0;.}..
7270: 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65  /*.** Join two e
7280: 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67  xpressions using
7290: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
72a0: 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78 70  .  If either exp
72b0: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55  ression is.** NU
72c0: 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  LL, then just re
72d0: 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65  turn the other e
72e0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
72f0: 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   If one side or 
7300: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
7310: 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74 6f   AND is known to
7320: 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   be false, then 
7330: 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72 65  instead.** of re
7340: 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20 65  turning an AND e
7350: 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74 20  xpression, just 
7360: 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61 6e  return a constan
7370: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  t expression wit
7380: 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66 20  h.** a value of 
7390: 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a  false..*/.Expr *
73a0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73  sqlite3ExprAnd(s
73b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
73c0: 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70   *pLeft, Expr *p
73d0: 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c  Right){.  if( pL
73e0: 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  eft==0 ){.    re
73f0: 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d  turn pRight;.  }
7400: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d  else if( pRight=
7410: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
7420: 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20   pLeft;.  }else 
7430: 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
7440: 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65 78  lse(pLeft) || ex
7450: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52  prAlwaysFalse(pR
7460: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
7470: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
7480: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
7490: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
74a0: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
74b0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
74c0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
74d0: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
74e0: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
74f0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
7500: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
7510: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
7520: 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29  b, TK_AND, 0, 0)
7530: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
7540: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
7550: 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c  db, pNew, pLeft,
7560: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
7570: 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d  turn pNew;.  }.}
7580: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
7590: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
75a0: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75  on node for a fu
75b0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74  nction with mult
75c0: 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iple.** argument
75d0: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
75e0: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
75f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
7600: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
7610: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
7620: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
7630: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7640: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
7650: 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20  rt( pToken );.  
7660: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
7670: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46  prAlloc(db, TK_F
7680: 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c  UNCTION, pToken,
7690: 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   1);.  if( pNew=
76a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
76b0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
76c0: 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41  db, pList); /* A
76d0: 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  void memory leak
76e0: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
76f0: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
7700: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
7710: 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  x.pList = pList;
7720: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
7730: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
7740: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
7750: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
7760: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
7770: 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  s(pParse, pNew);
7780: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7790: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
77a0: 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  a variable numbe
77b0: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
77c0: 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20  on that encodes 
77d0: 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e  a wildcard.** in
77e0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
77f0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a  L statement.  .*
7800: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63  *.** Wildcards c
7810: 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
7820: 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73  ingle "?" are as
7830: 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20  signed the next 
7840: 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61  sequential.** va
7850: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a  riable number..*
7860: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
7870: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
7880: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
7890: 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e  he number "nnn".
78a0: 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72    We make.** sur
78b0: 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74  e "nnn" is not t
78c0: 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20 61  oo be to avoid a
78d0: 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69   denial of servi
78e0: 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a  ce attack when.*
78f0: 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
7900: 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61  ent comes from a
7910: 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63  n external sourc
7920: 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  e..**.** Wildcar
7930: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
7940: 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20 6f  :aaa", "@aaa", o
7950: 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73 73  r "$aaa" are ass
7960: 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e  igned the same n
7970: 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20  umber.** as the 
7980: 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63  previous instanc
7990: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69  e of the same wi
79a0: 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74  ldcard.  Or if t
79b0: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
79c0: 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  .** instance of 
79d0: 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68  the wildcard, th
79e0: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61  e next sequentia
79f0: 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  l variable numbe
7a00: 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64  r is.** assigned
7a10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7a20: 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75  3ExprAssignVarNu
7a30: 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  mber(Parse *pPar
7a40: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
7a50: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
7a60: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7a70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a  const char *z;..
7a80: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
7a90: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
7aa0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
7ab0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
7ac0: 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63 65  tValue|EP_Reduce
7ad0: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  d|EP_TokenOnly) 
7ae0: 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e  );.  z = pExpr->
7af0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65  u.zToken;.  asse
7b00: 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73  rt( z!=0 );.  as
7b10: 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b  sert( z[0]!=0 );
7b20: 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29  .  if( z[1]==0 )
7b30: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
7b40: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
7b50: 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e  ".  Assign the n
7b60: 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ext variable num
7b70: 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ber */.    asser
7b80: 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a  t( z[0]=='?' );.
7b90: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
7ba0: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70  mn = (ynVar)(++p
7bb0: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
7bc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61 72  }else{.    ynVar
7bd0: 20 78 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20   x = 0;.    u32 
7be0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
7bf0: 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  n30(z);.    if( 
7c00: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  z[0]=='?' ){.   
7c10: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
7c20: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
7c30: 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e  ".  Convert "nnn
7c40: 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  " to an integer 
7c50: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  and.      ** use
7c60: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
7c70: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
7c80: 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20      i64 i;.     
7c90: 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71   int bOk = 0==sq
7ca0: 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31  lite3Atoi64(&z[1
7cb0: 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49  ], &i, n-1, SQLI
7cc0: 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
7cd0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
7ce0: 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20   x = (ynVar)i;. 
7cf0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
7d00: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
7d10: 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20  tcase( i==1 );. 
7d20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
7d30: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
7d40: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
7d50: 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a  LE_NUMBER]-1 );.
7d60: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7d70: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
7d80: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
7d90: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20  BLE_NUMBER] );. 
7da0: 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20       if( bOk==0 
7db0: 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e  || i<1 || i>db->
7dc0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7dd0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7de0: 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  BER] ){.        
7df0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7e00: 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c  pParse, "variabl
7e10: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65  e number must be
7e20: 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20   between ?1 and 
7e30: 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?%d",.          
7e40: 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c    db->aLimit[SQL
7e50: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
7e60: 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20  LE_NUMBER]);.   
7e70: 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 20       x = 0;.    
7e80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
7e90: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
7ea0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
7eb0: 6e 56 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a 20  nVar = (int)i;. 
7ec0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
7ed0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
7ee0: 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22  ards like ":aaa"
7ef0: 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61  , "$aaa" or "@aa
7f00: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
7f10: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
7f20: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
7f30: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
7f40: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
7f50: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
7f60: 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68   name.      ** h
7f70: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
7f80: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
7f90: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
7fa0: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
7fb0: 2f 0a 20 20 20 20 20 20 79 6e 56 61 72 20 69 3b  /.      ynVar i;
7fc0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
7fd0: 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b  i<pParse->nzVar;
7fe0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
7ff0: 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  f( pParse->azVar
8000: 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 70 50  [i] && strcmp(pP
8010: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c 7a  arse->azVar[i],z
8020: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8030: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
8040: 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 2b   = x = (ynVar)i+
8050: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
8060: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
8070: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8080: 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70 72  x==0 ) x = pExpr
8090: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56  ->iColumn = (ynV
80a0: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
80b0: 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ar);.    }.    i
80c0: 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( x>0 ){.      
80d0: 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e 7a  if( x>pParse->nz
80e0: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Var ){.        c
80f0: 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20 20  har **a;.       
8100: 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65   a = sqlite3DbRe
8110: 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73 65  alloc(db, pParse
8120: 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65 6f  ->azVar, x*sizeo
8130: 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  f(a[0]));.      
8140: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
8150: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8160: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8170: 20 29 3b 20 2f 2a 20 45 72 72 6f 72 20 72 65 70   ); /* Error rep
8180: 6f 72 74 65 64 20 74 68 72 6f 75 67 68 20 6d 61  orted through ma
8190: 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20  llocFailed */.  
81a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
81b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
81c0: 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20    pParse->azVar 
81d0: 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  = a;.        mem
81e0: 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e  set(&a[pParse->n
81f0: 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61  zVar], 0, (x-pPa
8200: 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65  rse->nzVar)*size
8210: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
8220: 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72     pParse->nzVar
8230: 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = x;.      }.  
8240: 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f      if( z[0]!='?
8250: 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56  ' || pParse->azV
8260: 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20  ar[x-1]==0 ){.  
8270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8280: 72 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  ree(db, pParse->
8290: 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20  azVar[x-1]);.   
82a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56       pParse->azV
82b0: 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65  ar[x-1] = sqlite
82c0: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 7a  3DbStrNDup(db, z
82d0: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
82e0: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21    }.  } .  if( !
82f0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20  pParse->nErr && 
8300: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d  pParse->nVar>db-
8310: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
8320: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
8330: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c  MBER] ){.    sql
8340: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8350: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53  rse, "too many S
8360: 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a  QL variables");.
8370: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
8380: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
8390: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
83a0: 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ee..*/.static SQ
83b0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
83c0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
83d0: 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a  leteNN(sqlite3 *
83e0: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
83f0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
8400: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
8410: 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  k: Assert that t
8420: 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e  he IntValue is n
8430: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69  on-negative if i
8440: 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73  t exists */.  as
8450: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
8460: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
8470: 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69  Value) || p->u.i
8480: 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66  Value>=0 );.  if
8490: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
84a0: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
84b0: 6c 79 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ly) ){.    /* Th
84c0: 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69  e Expr.x union i
84d0: 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20  s never used at 
84e0: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73  the same time as
84f0: 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a   Expr.pRight */.
8500: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78      assert( p->x
8510: 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e  .pList==0 || p->
8520: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
8530: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26   if( p->pLeft &&
8540: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43   p->op!=TK_SELEC
8550: 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74  T_COLUMN ) sqlit
8560: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64  e3ExprDeleteNN(d
8570: 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  b, p->pLeft);.  
8580: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8590: 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  ete(db, p->pRigh
85a0: 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
85b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
85c0: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71  P_MemToken) ) sq
85d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
85e0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
85f0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
8600: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
8610: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
8620: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
8630: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  ete(db, p->x.pSe
8640: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
8650: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8660: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
8670: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
8680: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
8690: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
86a0: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
86b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
86c0: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
86d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
86e0: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
86f0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
8700: 20 69 66 28 20 70 20 29 20 73 71 6c 69 74 65 33   if( p ) sqlite3
8710: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8720: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
8730: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8740: 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  of bytes allocat
8750: 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ed for the expre
8760: 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20  ssion structure 
8770: 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
8780: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
8790: 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
87a0: 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c   one of EXPR_FUL
87b0: 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52  LSIZE,.** EXPR_R
87c0: 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58  EDUCEDSIZE or EX
87d0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
87e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
87f0: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  exprStructSize(E
8800: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45  xpr *p){.  if( E
8810: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8820: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
8830: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f  ) return EXPR_TO
8840: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69  KENONLYSIZE;.  i
8850: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8860: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
8870: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
8880: 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72  REDUCEDSIZE;.  r
8890: 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53  eturn EXPR_FULLS
88a0: 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  IZE;.}../*.** Th
88b0: 65 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65  e dupedExpr*Size
88c0: 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68  () routines each
88d0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
88e0: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
88f0: 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ired.** to store
8900: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78   a copy of an ex
8910: 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72  pression or expr
8920: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68  ession tree.  Th
8930: 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20  ey differ in.** 
8940: 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20  how much of the 
8950: 74 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64  tree is measured
8960: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65  ..**.**     dupe
8970: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
8980: 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e  )     Size of on
8990: 6c 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75  ly the Expr stru
89a0: 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75  cture .**     du
89b0: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
89c0: 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20  )       Size of 
89d0: 45 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72  Expr + space for
89e0: 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75   token.**     du
89f0: 70 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20  pedExprSize()   
8a00: 20 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74          Expr + t
8a10: 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63  oken + subtree c
8a20: 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a  omponents.**.***
8a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a40: 2a 2a 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 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
8a80: 68 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75  he dupedExprStru
8a90: 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f  ctSize() functio
8aa0: 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61  n returns two va
8ab0: 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74  lues OR-ed toget
8ac0: 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68  her:  .** (1) th
8ad0: 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  e space required
8ae0: 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74   for a copy of t
8af0: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
8b00: 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28  e only and .** (
8b10: 32 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c  2) the EP_xxx fl
8b20: 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74  ags that indicat
8b30: 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63  e what the struc
8b40: 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64  ture size should
8b50: 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75   be..** The retu
8b60: 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77  rn values is alw
8b70: 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a  ays one of:.**.*
8b80: 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c  *      EXPR_FULL
8b90: 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50  SIZE.**      EXP
8ba0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20  R_REDUCEDSIZE   
8bb0: 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20  | EP_Reduced.** 
8bc0: 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f       EXPR_TOKENO
8bd0: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
8be0: 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65  enOnly.**.** The
8bf0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72   size of the str
8c00: 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f  ucture can be fo
8c10: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
8c20: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
8c30: 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ** of this routi
8c40: 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20  ne with 0xfff.  
8c50: 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65  The flags can be
8c60: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
8c70: 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20  g the.** return 
8c80: 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65  value with EP_Re
8c90: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
8ca0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ly..**.** Note t
8cb0: 68 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d  hat with flags==
8cc0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
8cd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f  this routines wo
8ce0: 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65  rks on full-size
8cf0: 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20  .** (unreduced) 
8d00: 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20  Expr objects as 
8d10: 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c  they or original
8d20: 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ly constructed b
8d30: 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a  y the parser..**
8d40: 20 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69   During expressi
8d50: 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74  on analysis, ext
8d60: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
8d70: 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d  s computed and m
8d80: 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74  oved into.** lat
8d90: 65 72 20 70 61 72 74 73 20 6f 66 20 74 65 68 20  er parts of teh 
8da0: 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  Expr object and 
8db0: 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72  that extra infor
8dc0: 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74  mation might get
8dd0: 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20   chopped.** off 
8de0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
8df0: 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e  n is reduced.  N
8e00: 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74  ote also that it
8e10: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74   does not work t
8e20: 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50  o.** make an EXP
8e30: 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79  RDUP_REDUCE copy
8e40: 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78   of a reduced ex
8e50: 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73  pression.  It is
8e60: 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74   only legal.** t
8e70: 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74  o reduce a prist
8e80: 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ine expression t
8e90: 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ree from the par
8ea0: 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d  ser.  The implem
8eb0: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64  entation.** of d
8ec0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
8ed0: 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c  ze() contain mul
8ee0: 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73  tiple assert() s
8ef0: 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61  tatements that a
8f00: 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66  ttempt.** to enf
8f10: 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72  orce this constr
8f20: 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aint..*/.static 
8f30: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72  int dupedExprStr
8f40: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  uctSize(Expr *p,
8f50: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
8f60: 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65  nt nSize;.  asse
8f70: 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  rt( flags==EXPRD
8f80: 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61  UP_REDUCE || fla
8f90: 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79  gs==0 ); /* Only
8fa0: 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20   one flag value 
8fb0: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73  allowed */.  ass
8fc0: 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49  ert( EXPR_FULLSI
8fd0: 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61  ZE<=0xfff );.  a
8fe0: 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26 20  ssert( (0xfff & 
8ff0: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
9000: 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b  okenOnly))==0 );
9010: 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20  .  if( 0==flags 
9020: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  ){.    nSize = E
9030: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20  XPR_FULLSIZE;.  
9040: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
9050: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
9060: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
9070: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
9080: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
9090: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
90a0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
90b0: 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  ); .    assert( 
90c0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
90d0: 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  (p, EP_MemToken)
90e0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
90f0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
9100: 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  (p, EP_NoReduce)
9110: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
9120: 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69  Left || p->x.pLi
9130: 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  st ){.      nSiz
9140: 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44  e = EXPR_REDUCED
9150: 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65  SIZE | EP_Reduce
9160: 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
9170: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
9180: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
9190: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54    nSize = EXPR_T
91a0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
91b0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20  P_TokenOnly;.   
91c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
91d0: 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nSize;.}../*.** 
91e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
91f0: 74 75 72 6e 73 20 74 68 65 20 73 70 61 63 65 20  turns the space 
9200: 69 6e 20 62 79 74 65 73 20 72 65 71 75 69 72 65  in bytes require
9210: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  d to store the c
9220: 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45  opy .** of the E
9230: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  xpr structure an
9240: 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  d a copy of the 
9250: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74  Expr.u.zToken st
9260: 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a  ring (if that.**
9270: 20 73 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e   string is defin
9280: 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ed.).*/.static i
9290: 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  nt dupedExprNode
92a0: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
92b0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
92c0: 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70  nByte = dupedExp
92d0: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66  rStructSize(p, f
92e0: 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20  lags) & 0xfff;. 
92f0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
9300: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
9310: 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54  alue) && p->u.zT
9320: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74  oken ){.    nByt
9330: 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
9340: 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  en30(p->u.zToken
9350: 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  )+1;.  }.  retur
9360: 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  n ROUND8(nByte);
9370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9380: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
9390: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
93a0: 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69 63   create a duplic
93b0: 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65  ate of the .** e
93c0: 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64  xpression passed
93d0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
93e0: 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f  gument. The seco
93f0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
9400: 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  .** mask contain
9410: 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58 20  ing EXPRDUP_XXX 
9420: 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
9430: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
9440: 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20 74  includes space t
9450: 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  o create a copy 
9460: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
9470: 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64  ct.** itself and
9480: 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66 65   the buffer refe
9490: 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e  rred to by Expr.
94a0: 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79  u.zToken, if any
94b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
94c0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c  XPRDUP_REDUCE fl
94d0: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
94e0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
94f0: 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70   includes .** sp
9500: 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65  ace to duplicate
9510: 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20   all Expr nodes 
9520: 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d  in the tree form
9530: 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74  ed by Expr.pLeft
9540: 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52   .** and Expr.pR
9550: 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28  ight variables (
9560: 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20  but not for any 
9570: 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74  structures point
9580: 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73  ed to or .** des
9590: 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cended from the 
95a0: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20  Expr.x.pList or 
95b0: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76  Expr.x.pSelect v
95c0: 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74  ariables)..*/.st
95d0: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
95e0: 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  prSize(Expr *p, 
95f0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
9600: 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69  t nByte = 0;.  i
9610: 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74  f( p ){.    nByt
9620: 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64  e = dupedExprNod
9630: 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  eSize(p, flags);
9640: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45  .    if( flags&E
9650: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b  XPRDUP_REDUCE ){
9660: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
9670: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
9680: 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b  >pLeft, flags) +
9690: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
96a0: 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29  ->pRight, flags)
96b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
96c0: 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f  turn nByte;.}../
96d0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
96e0: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
96f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9700: 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
9710: 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69  f pzBuffer .** i
9720: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
9730: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73  *pzBuffer is ass
9740: 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  umed to point to
9750: 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
9760: 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74  enough .** to st
9770: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20  ore the copy of 
9780: 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68  expression p, th
9790: 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75  e copies of p->u
97a0: 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61  .zToken.** (if a
97b0: 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20  pplicable), and 
97c0: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  the copies of th
97d0: 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  e p->pLeft and p
97e0: 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73 73  ->pRight express
97f0: 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  ions,.** if any.
9800: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
9810: 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  g, *pzBuffer is 
9820: 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  set to the first
9830: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a   byte past the.*
9840: 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  * portion of the
9850: 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69   buffer copied i
9860: 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63  nto by this func
9870: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9880: 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71  Expr *exprDup(sq
9890: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
98a0: 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67 73  *p, int dupFlags
98b0: 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29  , u8 **pzBuffer)
98c0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20  {.  Expr *pNew; 
98d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
98e0: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
98f0: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20    u8 *zAlloc;   
9900: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
9910: 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68 69  y space from whi
9920: 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70 72  ch to build Expr
9930: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32   object */.  u32
9940: 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20 20   staticFlag;    
9950: 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63 20     /* EP_Static 
9960: 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62 74  if space not obt
9970: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
9980: 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  c */..  assert( 
9990: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
99a0: 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74  t( p );.  assert
99b0: 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c  ( dupFlags==0 ||
99c0: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
99d0: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61  UP_REDUCE );.  a
99e0: 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d  ssert( pzBuffer=
99f0: 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d  =0 || dupFlags==
9a00: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
9a10: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
9a20: 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74  ut where to writ
9a30: 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73  e the new Expr s
9a40: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69  tructure. */.  i
9a50: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
9a60: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42     zAlloc = *pzB
9a70: 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74 69  uffer;.    stati
9a80: 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69  cFlag = EP_Stati
9a90: 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
9aa0: 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  zAlloc = sqlite3
9ab0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
9ac0: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
9ad0: 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a 20  p, dupFlags));. 
9ae0: 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20     staticFlag = 
9af0: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20  0;.  }.  pNew = 
9b00: 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a  (Expr *)zAlloc;.
9b10: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
9b20: 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69     /* Set nNewSi
9b30: 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61  ze to the size a
9b40: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
9b50: 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
9b60: 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20  ed to.    ** by 
9b70: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
9b80: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
9b90: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
9ba0: 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45  SIZE or.    ** E
9bb0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
9bc0: 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74  E. nToken is set
9bd0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
9be0: 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64  f bytes consumed
9bf0: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63  .    ** by the c
9c00: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
9c10: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
9c20: 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
9c30: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
9c40: 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20  d nStructSize = 
9c50: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
9c60: 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29  ize(p, dupFlags)
9c70: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
9c80: 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75  nNewSize = nStru
9c90: 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a  ctSize & 0xfff;.
9ca0: 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a      int nToken;.
9cb0: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
9cc0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
9cd0: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
9ce0: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20  .zToken ){.     
9cf0: 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65   nToken = sqlite
9d00: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
9d10: 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20  Token) + 1;.    
9d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f  }else{.      nTo
9d30: 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ken = 0;.    }. 
9d40: 20 20 20 69 66 28 20 64 75 70 46 6c 61 67 73 20     if( dupFlags 
9d50: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
9d60: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
9d70: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d  (p, EP_Reduced)=
9d80: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 );.      memc
9d90: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e  py(zAlloc, p, nN
9da0: 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  ewSize);.    }el
9db0: 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 53  se{.      u32 nS
9dc0: 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72 53  ize = (u32)exprS
9dd0: 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20  tructSize(p);.  
9de0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
9df0: 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  c, p, nSize);.  
9e00: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58      if( nSize<EX
9e10: 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a  PR_FULLSIZE ){ .
9e20: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
9e30: 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30  zAlloc[nSize], 0
9e40: 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d  , EXPR_FULLSIZE-
9e50: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nSize);.      }.
9e60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
9e70: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
9e80: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20  , EP_TokenOnly, 
9e90: 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c  and EP_Static fl
9ea0: 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ags appropriatel
9eb0: 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  y. */.    pNew->
9ec0: 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65  flags &= ~(EP_Re
9ed0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
9ee0: 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f  ly|EP_Static|EP_
9ef0: 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70  MemToken);.    p
9f00: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53  New->flags |= nS
9f10: 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f  tructSize & (EP_
9f20: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
9f30: 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Only);.    pNew-
9f40: 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63  >flags |= static
9f50: 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  Flag;..    /* Co
9f60: 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  py the p->u.zTok
9f70: 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  en string, if an
9f80: 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54  y. */.    if( nT
9f90: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68  oken ){.      ch
9fa0: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
9fb0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
9fc0: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
9fd0: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65  wSize];.      me
9fe0: 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e  mcpy(zToken, p->
9ff0: 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  u.zToken, nToken
a000: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
a010: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
a020: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45  pNew->flags) & E
a030: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
a040: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
a050: 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65   the pNew->x.pSe
a060: 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e  lect or pNew->x.
a070: 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f  pList member. */
a080: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
a090: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
a0a0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
a0b0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
a0c0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
a0d0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
a0e0: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75 70 46  >x.pSelect, dupF
a0f0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lags);.      }el
a100: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
a110: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69  ->x.pList = sqli
a120: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
a130: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 64  b, p->x.pList, d
a140: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a150: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a160: 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c  Fill in pNew->pL
a170: 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52  eft and pNew->pR
a180: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ight. */.    if(
a190: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a1a0: 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65  (pNew, EP_Reduce
a1b0: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  d|EP_TokenOnly) 
a1c0: 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  ){.      zAlloc 
a1d0: 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  += dupedExprNode
a1e0: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
a1f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
a200: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
a210: 77 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  w, EP_Reduced) )
a220: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a230: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a240: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a250: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a260: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a270: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a280: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a290: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a2a0: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2c0: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a2d0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a2e0: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a2f0: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a300: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a    }.      if( pz
a310: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
a320: 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41    *pzBuffer = zA
a330: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lloc;.      }.  
a340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
a350: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a360: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
a370: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
a380: 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b  if( pNew->op==TK
a390: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
a3a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
a3b0: 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65  ->pLeft = p->pLe
a3c0: 66 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ft;.        }els
a3d0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
a3e0: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
a3f0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
a400: 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
a410: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e      }.        pN
a420: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  ew->pRight = sql
a430: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
a440: 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  p->pRight, 0);. 
a450: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a460: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
a470: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
a480: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65  and return a dee
a490: 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62  p copy of the ob
a4a0: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
a4b0: 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72  he second .** ar
a4c0: 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f  gument. If an OO
a4d0: 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65  M condition is e
a4e0: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c  ncountered, NULL
a4f0: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
a500: 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  and the db->mall
a510: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65  ocFailed flag se
a520: 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
a530: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74  LITE_OMIT_CTE.st
a540: 61 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44  atic With *withD
a550: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
a560: 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68  With *p){.  With
a570: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *pRet = 0;.  if
a580: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ( p ){.    int n
a590: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
a5a0: 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  ) + sizeof(p->a[
a5b0: 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31  0]) * (p->nCte-1
a5c0: 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  );.    pRet = sq
a5d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
a5e0: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
a5f0: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
a600: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
a610: 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d   pRet->nCte = p-
a620: 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72  >nCte;.      for
a630: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b  (i=0; i<p->nCte;
a640: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
a650: 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Ret->a[i].pSelec
a660: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
a670: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
a680: 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
a690: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
a6a0: 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33  .pCols = sqlite3
a6b0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
a6c0: 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30  p->a[i].pCols, 0
a6d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
a6e0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
a6f0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
a700: 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
a710: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a720: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
a730: 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
a740: 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29  ine withDup(x,y)
a750: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
a760: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
a770: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
a780: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
a790: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
a7a0: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
a7b0: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
a7c0: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
a7d0: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
a7e0: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
a7f0: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
a800: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
a810: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
a820: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
a830: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
a840: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
a850: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
a860: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
a870: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
a880: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
a890: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
a8a0: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
a8b0: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
a8c0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
a8d0: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
a8e0: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
a8f0: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
a900: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
a910: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
a920: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
a930: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
a940: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
a950: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
a960: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a  t duplicated..**
a970: 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
a980: 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73  rameter contains
a990: 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
a9a0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58  f the EXPRDUP_XX
a9b0: 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74  X flags..** If t
a9c0: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
a9d0: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
a9e0: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
a9f0: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a  e returned is a.
aa00: 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72  ** truncated ver
aa10: 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61  sion of the usua
aa20: 6c 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  l Expr structure
aa30: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74   that will be st
aa40: 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  ored as.** part 
aa50: 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
aa60: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
aa70: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
aa80: 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20  schema..*/.Expr 
aa90: 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  *sqlite3ExprDup(
aaa0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
aab0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
aac0: 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  {.  assert( flag
aad0: 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 45  s==0 || flags==E
aae0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b  XPRDUP_REDUCE );
aaf0: 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20 65 78  .  return p ? ex
ab00: 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61  prDup(db, p, fla
ab10: 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a 45 78  gs, 0) : 0;.}.Ex
ab20: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
ab30: 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74  xprListDup(sqlit
ab40: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
ab50: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
ab60: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65  .  ExprList *pNe
ab70: 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  w;.  struct Expr
ab80: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
ab90: 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69  , *pOldItem;.  i
aba0: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
abb0: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
abc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
abd0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
abe0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
abf0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
ac00: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
ac10: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
ac20: 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69 20 3d  New->nExpr = i =
ac30: 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28   p->nExpr;.  if(
ac40: 20 28 66 6c 61 67 73 20 26 20 45 58 50 52 44 55   (flags & EXPRDU
ac50: 50 5f 52 45 44 55 43 45 29 3d 3d 30 20 29 20 66  P_REDUCE)==0 ) f
ac60: 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=1; i<p->nEx
ac70: 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e  pr; i+=i){}.  pN
ac80: 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20  ew->a = pItem = 
ac90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
aca0: 61 77 4e 4e 28 64 62 2c 20 20 69 2a 73 69 7a 65  awNN(db,  i*size
acb0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
acc0: 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b   if( pItem==0 ){
acd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
ace0: 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ee(db, pNew);.  
acf0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
ad00: 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d  .  pOldItem = p-
ad10: 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  >a;.  for(i=0; i
ad20: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  <p->nExpr; i++, 
ad30: 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65  pItem++, pOldIte
ad40: 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
ad50: 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49  pOldExpr = pOldI
ad60: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
ad70: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73  pItem->pExpr = s
ad80: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
ad90: 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67  , pOldExpr, flag
ada0: 73 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  s);.    pItem->z
adb0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
adc0: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
add0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
ade0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
adf0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ae00: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53  db, pOldItem->zS
ae10: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  pan);.    pItem-
ae20: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c  >sortOrder = pOl
ae30: 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  dItem->sortOrder
ae40: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e  ;.    pItem->don
ae50: 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d  e = 0;.    pItem
ae60: 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70  ->bSpanIsTab = p
ae70: 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73  OldItem->bSpanIs
ae80: 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  Tab;.    pItem->
ae90: 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b  u = pOldItem->u;
aea0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
aeb0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ew;.}../*.** If 
aec0: 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72  cursors, trigger
aed0: 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  s, views and sub
aee0: 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20  queries are all 
aef0: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  omitted from.** 
af00: 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  the build, then 
af10: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  none of the foll
af20: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20  owing routines, 
af30: 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73  except for .** s
af40: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
af50: 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ), can be called
af60: 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  . sqlite3SelectD
af70: 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65  up() is sometime
af80: 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68  s.** called with
af90: 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74   a NULL argument
afa0: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
afb0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
afc0: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
afd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
afe0: 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69  GER) \. || !defi
aff0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b000: 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73  SUBQUERY).SrcLis
b010: 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
b020: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
b030: 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e  , SrcList *p, in
b040: 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c  t flags){.  SrcL
b050: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
b060: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   i;.  int nByte;
b070: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
b080: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
b090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79   return 0;.  nBy
b0a0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
b0b0: 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73  + (p->nSrc>0 ? s
b0c0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
b0d0: 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30   (p->nSrc-1) : 0
b0e0: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
b0f0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b100: 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
b110: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
b120: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
b130: 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  nSrc = pNew->nAl
b140: 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20  loc = p->nSrc;. 
b150: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b160: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
b170: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
b180: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
b190: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
b1a0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
b1b0: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
b1c0: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61  &p->a[i];.    Ta
b1d0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
b1e0: 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61  NewItem->pSchema
b1f0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63   = pOldItem->pSc
b200: 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74  hema;.    pNewIt
b210: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
b220: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b230: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44  db, pOldItem->zD
b240: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e  atabase);.    pN
b250: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
b260: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b270: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
b280: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
b290: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
b2a0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b2b0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61   pOldItem->zAlia
b2c0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
b2d0: 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ->fg = pOldItem-
b2e0: 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  >fg;.    pNewIte
b2f0: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
b300: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
b310: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64      pNewItem->ad
b320: 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64  drFillSub = pOld
b330: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
b340: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
b350: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c  >regReturn = pOl
b360: 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  dItem->regReturn
b370: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74  ;.    if( pNewIt
b380: 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  em->fg.isIndexed
b390: 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  By ){.      pNew
b3a0: 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
b3b0: 64 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53  dBy = sqlite3DbS
b3c0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b3d0: 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
b3e0: 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  y);.    }.    pN
b3f0: 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78  ewItem->pIBIndex
b400: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42   = pOldItem->pIB
b410: 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
b420: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  NewItem->fg.isTa
b430: 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70  bFunc ){.      p
b440: 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  NewItem->u1.pFun
b450: 63 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20  cArg = .        
b460: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b470: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
b480: 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20  m->u1.pFuncArg, 
b490: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
b4a0: 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65    pTab = pNewIte
b4b0: 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74  m->pTab = pOldIt
b4c0: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
b4d0: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
b4e0: 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  pTab->nRef++;.  
b4f0: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
b500: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
b510: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
b520: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
b530: 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ct, flags);.    
b540: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
b550: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b560: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  b, pOldItem->pOn
b570: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
b580: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
b590: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
b5a0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b5b0: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
b5c0: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
b5d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
b5e0: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
b5f0: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
b600: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
b610: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
b620: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
b630: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
b640: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   i;.  assert( db
b650: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
b660: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b670: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
b680: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
b690: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
b6a0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
b6b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b6c0: 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b  w->nId = p->nId;
b6d0: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
b6e0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b6f0: 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a  N(db, p->nId*siz
b700: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
b710: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
b720: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
b730: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
b740: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
b750: 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61   }.  /* Note tha
b760: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69  t because the si
b770: 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ze of the alloca
b780: 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20  tion for p->a[] 
b790: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65  is not.  ** nece
b7a0: 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20  ssarily a power 
b7b0: 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49  of two, sqlite3I
b7c0: 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61  dListAppend() ma
b7d0: 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a  y not be called.
b7e0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c    ** on the dupl
b7f0: 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79  icate created by
b800: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
b810: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
b820: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
b830: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
b840: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
b850: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
b860: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
b870: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
b880: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
b890: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
b8a0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
b8b0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
b8c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
b8d0: 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49  tem->idx = pOldI
b8e0: 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20  tem->idx;.  }.  
b8f0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53  return pNew;.}.S
b900: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
b910: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
b920: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
b930: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65  int flags){.  Se
b940: 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72  lect *pNew, *pPr
b950: 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ior;.  assert( d
b960: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b970: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b980: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
b990: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
b9a0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
b9b0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
b9c0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
b9d0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
b9e0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
b9f0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67   p->pEList, flag
ba00: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63  s);.  pNew->pSrc
ba10: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
ba20: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
ba30: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
ba40: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
ba50: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
ba60: 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b  >pWhere, flags);
ba70: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
ba80: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
ba90: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47  istDup(db, p->pG
baa0: 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a  roupBy, flags);.
bab0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
bac0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
bad0: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
bae0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
baf0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
bb00: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
bb10: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
bb20: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
bb30: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
bb40: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
bb50: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
bb60: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  ectDup(db, p->pP
bb70: 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  rior, flags);.  
bb80: 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72  if( pPrior ) pPr
bb90: 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
bba0: 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  w;.  pNew->pNext
bbb0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c   = 0;.  pNew->pL
bbc0: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
bbd0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
bbe0: 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  mit, flags);.  p
bbf0: 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73  New->pOffset = s
bc00: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
bc10: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c  , p->pOffset, fl
bc20: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  ags);.  pNew->iL
bc30: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
bc40: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
bc50: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
bc60: 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  = p->selFlags & 
bc70: 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61  ~SF_UsesEphemera
bc80: 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  l;.  pNew->addrO
bc90: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
bca0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
bcb0: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
bcc0: 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f   pNew->nSelectRo
bcd0: 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w = p->nSelectRo
bce0: 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  w;.  pNew->pWith
bcf0: 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20 70   = withDup(db, p
bd00: 2d 3e 70 57 69 74 68 29 3b 0a 20 20 73 71 6c 69  ->pWith);.  sqli
bd10: 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
bd20: 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61  (pNew, p->zSelNa
bd30: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  me);.  return pN
bd40: 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  ew;.}.#else.Sele
bd50: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
bd60: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
bd70: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
bd80: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
bd90: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
bda0: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
bdb0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
bdc0: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
bdd0: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
bde0: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
bdf0: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
be00: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
be10: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
be20: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
be30: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
be40: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
be50: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e  r occurs, the en
be60: 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65  tire list is fre
be70: 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69  ed and.** NULL i
be80: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
be90: 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75  non-NULL is retu
bea0: 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  rned, then it is
beb0: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
bec0: 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hat the new entr
bed0: 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  y was successful
bee0: 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a  ly appended..*/.
bef0: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
bf00: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
bf10: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bf20: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
bf30: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
bf40: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
bf50: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
bf60: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
bf70: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
bf80: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
bf90: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
bfa0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
bfb0: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  to be appended. 
bfc0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
bfd0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
bfe0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
bff0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
c000: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  );.  if( pList==
c010: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
c020: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c030: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
c040: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
c050: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
c060: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
c070: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
c080: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b  List->nExpr = 0;
c090: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
c0a0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
c0b0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
c0c0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
c0d0: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d     if( pList->a=
c0e0: 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
c0f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
c100: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70  List->nExpr & (p
c110: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d  List->nExpr-1))=
c120: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
c130: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
c140: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
c150: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
c160: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33  .    a = sqlite3
c170: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
c180: 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
c190: 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c  Expr*2*sizeof(pL
c1a0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
c1b0: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
c1c0: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
c1d0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
c1e0: 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73  >a = a;.  }.  as
c1f0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
c200: 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a  0 );.  if( 1 ){.
c210: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
c220: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
c230: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
c240: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
c250: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
c260: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
c270: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
c280: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
c290: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
c2a0: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
c2b0: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
c2c0: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
c2d0: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
c2e0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
c2f0: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
c300: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
c310: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
c320: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
c330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75  ;.}../*.** pColu
c340: 6d 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f  mns and pExpr fo
c350: 72 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69  rm a vector assi
c360: 67 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gnment which is 
c370: 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a  part of the SET.
c380: 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20  ** clause of an 
c390: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
c3a0: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
c3b0: 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c  .**        (a,b,
c3c0: 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72  c) = (expr1,expr
c3d0: 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20  2,expr3).** Or: 
c3e0: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45     (a,b,c) = (SE
c3f0: 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20  LECT x,y,z FROM 
c400: 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ....).**.** For 
c410: 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
c420: 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65   vector assignme
c430: 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65  nt, append new e
c440: 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a  ntries to the.**
c450: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
c460: 20 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20   pList.  In the 
c470: 63 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65  case of a subque
c480: 72 79 20 6f 6e 20 74 68 65 20 4c 48 53 2c 20 61  ry on the LHS, a
c490: 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45  ppend.** TK_SELE
c4a0: 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73  CT_COLUMN expres
c4b0: 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69  sions..*/.ExprLi
c4c0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
c4d0: 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28  istAppendVector(
c4e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c4f0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
c500: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c510: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
c520: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
c530: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
c540: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
c550: 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  LL */.  IdList *
c560: 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f  pColumns,      /
c570: 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  * List of names 
c580: 6f 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73  of LHS of the as
c590: 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  signment */.  Ex
c5a0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
c5b0: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65       /* Vector e
c5c0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
c5d0: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
c5e0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
c5f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
c600: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
c610: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
c620: 74 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74  t iFirst = pList
c630: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
c640: 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d  : 0;.  /* pColum
c650: 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e  ns can only be N
c660: 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f  ULL due to an OO
c670: 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c  M but an OOM wil
c680: 6c 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20  l cause an.  ** 
c690: 65 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68  exit prior to th
c6a0: 69 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67  is routine being
c6b0: 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66   invoked */.  if
c6c0: 28 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73  ( NEVER(pColumns
c6d0: 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74  ==0) ) goto vect
c6e0: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
c6f0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
c700: 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70  ) goto vector_ap
c710: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 6e 20  pend_error;.  n 
c720: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
c730: 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3b 0a  torSize(pExpr);.
c740: 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 73 2d 3e    if( pColumns->
c750: 6e 49 64 21 3d 6e 20 29 7b 0a 20 20 20 20 73 71  nId!=n ){.    sq
c760: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
c770: 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e  arse, "%d column
c780: 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61  s assigned %d va
c790: 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20  lues",.         
c7a0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 75             pColu
c7b0: 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20  mns->nId, n);.  
c7c0: 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70    goto vector_ap
c7d0: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  pend_error;.  }.
c7e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
c7f0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
c800: 70 53 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74  pSubExpr = sqlit
c810: 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46  e3ExprForVectorF
c820: 69 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78  ield(pParse, pEx
c830: 70 72 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73  pr, i);.    pLis
c840: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
c850: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
c860: 2c 20 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70  , pList, pSubExp
c870: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  r);.    if( pLis
c880: 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
c890: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
c8a0: 3d 69 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20  =iFirst+i+1 );. 
c8b0: 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c       pList->a[pL
c8c0: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  ist->nExpr-1].zN
c8d0: 61 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e  ame = pColumns->
c8e0: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
c8f0: 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d    pColumns->a[i]
c900: 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
c910: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  }.  }.  if( pExp
c920: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
c930: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   ){.    if( pLis
c940: 74 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 46  t && pList->a[iF
c950: 69 72 73 74 5d 2e 70 45 78 70 72 20 29 7b 0a 20  irst].pExpr ){. 
c960: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
c970: 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45  st->a[iFirst].pE
c980: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
c990: 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  CT_COLUMN );.   
c9a0: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72     pList->a[iFir
c9b0: 73 74 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67 68  st].pExpr->pRigh
c9c0: 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  t = pExpr;.     
c9d0: 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20   pExpr = 0;.    
c9e0: 7d 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61 70  }.  }..vector_ap
c9f0: 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71  pend_error:.  sq
ca00: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
ca10: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  db, pExpr);.  sq
ca20: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
ca30: 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b  e(db, pColumns);
ca40: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
ca50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
ca60: 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f 72  e sort order for
ca70: 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
ca80: 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 45  t on the given E
ca90: 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  xprList..*/.void
caa0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
cab0: 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78 70  SetSortOrder(Exp
cac0: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69 53  rList *p, int iS
cad0: 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66 28  ortOrder){.  if(
cae0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
caf0: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
cb00: 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20  _SO_UNDEFINED<0 
cb10: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  && SQLITE_SO_ASC
cb20: 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  >=0 && SQLITE_SO
cb30: 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73  _DESC>0 );.  ass
cb40: 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30 20  ert( p->nExpr>0 
cb50: 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72  );.  if( iSortOr
cb60: 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73 73  der<0 ){.    ass
cb70: 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78  ert( p->a[p->nEx
cb80: 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 3d  pr-1].sortOrder=
cb90: 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29  =SQLITE_SO_ASC )
cba0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
cbb0: 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70  }.  p->a[p->nExp
cbc0: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  r-1].sortOrder =
cbd0: 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72 3b   (u8)iSortOrder;
cbe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
cbf0: 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  e ExprList.a[].z
cc00: 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Name element of 
cc10: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
cc20: 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20  y added item.** 
cc30: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
cc40: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  n list..**.** pL
cc50: 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ist might be NUL
cc60: 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f  L following an O
cc70: 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70  OM error.  But p
cc80: 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  Name should neve
cc90: 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49  r be.** NULL.  I
cca0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
ccb0: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
ccc0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
ccd0: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a  locFailed flag.*
cce0: 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  * is set..*/.voi
ccf0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
cd00: 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73  tSetName(.  Pars
cd10: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
cd20: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
cd30: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
cd40: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
cd50: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
cd60: 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20  hich to add the 
cd70: 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  span. */.  Token
cd80: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *pName,        
cd90: 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65     /* Name to be
cda0: 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   added */.  int 
cdb0: 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20  dequote         
cdc0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63      /* True to c
cdd0: 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f  ause the name to
cde0: 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a   be dequoted */.
cdf0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  ){.  assert( pLi
ce00: 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  st!=0 || pParse-
ce10: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
ce20: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  d!=0 );.  if( pL
ce30: 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ist ){.    struc
ce40: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
ce50: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65  *pItem;.    asse
ce60: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
ce70: 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20  >0 );.    pItem 
ce80: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
ce90: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
cea0: 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
ceb0: 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  zName==0 );.    
cec0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
ced0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
cee0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
cef0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
cf00: 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65  .    if( dequote
cf10: 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74   ) sqlite3Dequot
cf20: 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  e(pItem->zName);
cf30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
cf40: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
cf50: 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74  [].zSpan element
cf60: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
cf70: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
cf80: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
cf90: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
cfa0: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
cfb0: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
cfc0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
cfd0: 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20  ut pSpan should 
cfe0: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
cff0: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
d000: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
d010: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
d020: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
d030: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
d040: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
d050: 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20  rListSetSpan(.  
d060: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d070: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
d080: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
d090: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
d0a0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
d0b0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
d0c0: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45  the span. */.  E
d0d0: 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20  xprSpan *pSpan  
d0e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
d0f0: 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  an to be added *
d100: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d110: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d120: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
d130: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
d140: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
d150: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
d160: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
d170: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
d180: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
d190: 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73  nExpr-1];.    as
d1a0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
d1b0: 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  pr>0 );.    asse
d1c0: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
d1d0: 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70  iled || pItem->p
d1e0: 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78  Expr==pSpan->pEx
d1f0: 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pr );.    sqlite
d200: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
d210: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
d220: 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71  Item->zSpan = sq
d230: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
d240: 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d  b, (char*)pSpan-
d250: 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20  >zStart,.       
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
d280: 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d  t)(pSpan->zEnd -
d290: 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29   pSpan->zStart))
d2a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
d2b0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
d2c0: 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e   list pEList con
d2d0: 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  tains more than 
d2e0: 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c  iLimit elements,
d2f0: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
d300: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
d310: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
d320: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
d330: 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73  ckLength(.  Pars
d340: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70  e *pParse,.  Exp
d350: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20  rList *pEList,. 
d360: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62   const char *zOb
d370: 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78  ject.){.  int mx
d380: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
d390: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
d3a0: 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65  IT_COLUMN];.  te
d3b0: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
d3c0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
d3d0: 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73  =mx );.  testcas
d3e0: 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  e( pEList && pEL
d3f0: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31  ist->nExpr==mx+1
d400: 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
d410: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
d420: 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  r>mx ){.    sqli
d430: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d440: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
d450: 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f  lumns in %s", zO
d460: 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bject);.  }.}../
d470: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
d480: 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e  ntire expression
d490: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
d4a0: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
d4b0: 20 76 6f 69 64 20 65 78 70 72 4c 69 73 74 44 65   void exprListDe
d4c0: 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a  leteNN(sqlite3 *
d4d0: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
d4e0: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
d4f0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
d500: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
d510: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
d520: 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  !=0 || pList->nE
d530: 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  xpr==0 );.  for(
d540: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
d550: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
d560: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
d570: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
d580: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
d590: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
d5a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d5b0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
d5c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
d5d0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
d5e0: 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Span);.  }.  sql
d5f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d600: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
d610: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
d620: 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ist);.}.void sql
d630: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
d640: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
d650: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
d660: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20  {.  if( pList ) 
d670: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
d680: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
d690: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d6a0: 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61   bitwise-OR of a
d6b0: 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69  ll Expr.flags fi
d6c0: 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65  elds in the give
d6d0: 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a  n.** ExprList..*
d6e0: 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70  /.u32 sqlite3Exp
d6f0: 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74  rListFlags(const
d700: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d710: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33  ){.  int i;.  u3
d720: 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  2 m = 0;.  if( p
d730: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
d740: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
d750: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
d760: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
d770: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
d780: 72 3b 0a 20 20 20 20 20 20 20 61 73 73 65 72 74  r;.       assert
d790: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
d7a0: 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d       m |= pExpr-
d7b0: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
d7c0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a  }.  return m;.}.
d7d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  ./*.** These rou
d7e0: 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72  tines are Walker
d7f0: 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20   callbacks used 
d800: 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  to check express
d810: 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69  ions to.** see i
d820: 66 20 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73  f they are "cons
d830: 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64  tant" for some d
d840: 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e  efinition of con
d850: 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57  stant.  The.** W
d860: 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75  alker.eCode valu
d870: 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  e determines the
d880: 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61   type of "consta
d890: 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  nt" we are looki
d8a0: 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a  ng.** for..**.**
d8b0: 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20   These callback 
d8c0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
d8d0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
d8e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
d8f0: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
d900: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20  xprIsConstant() 
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
d930: 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =1.**     sqlite
d940: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
d950: 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20  otJoin()        
d960: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
d970: 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==2.**     sqli
d980: 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
d990: 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20  nstant()        
d9a0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
d9b0: 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71  ode==3.**     sq
d9c0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
d9d0: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20  antOrFunction() 
d9e0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
d9f0: 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a  eCode==4 or 5.**
da00: 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  .** In all cases
da10: 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20  , the callbacks 
da20: 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  set Walker.eCode
da30: 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20  =0 and abort if 
da40: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
da50: 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f  * is found to no
da60: 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e  t be a constant.
da70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
da80: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
da90: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20  OrFunction() is 
daa0: 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74  used for evaluat
dab0: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ing expressions.
dac0: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
dad0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
dae0: 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64   The Walker.eCod
daf0: 65 20 76 61 6c 75 65 20 69 73 20 35 20 77 68 65  e value is 5 whe
db00: 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20  n parsing.** an 
db10: 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20  existing schema 
db20: 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65  and 4 when proce
db30: 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74  ssing a new stat
db40: 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a  ement.  A bound.
db50: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72 61 69  ** parameter rai
db60: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  ses an error for
db70: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c   new statements,
db80: 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79   but is silently
db90: 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f   converted.** to
dba0: 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69   NULL for existi
dbb0: 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69  ng schemas.  Thi
dbc0: 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f  s allows sqlite_
dbd0: 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 74 68  master tables th
dbe0: 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61  at .** contain a
dbf0: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
dc00: 20 62 65 63 61 75 73 65 20 74 68 65 79 20 77 65   because they we
dc10: 72 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  re generated by 
dc20: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a  older versions.*
dc30: 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62  * of SQLite to b
dc40: 65 20 70 61 72 73 65 64 20 62 79 20 6e 65 77 65  e parsed by newe
dc50: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
dc60: 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72 61 69  Lite without rai
dc70: 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72  sing a.** malfor
dc80: 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72  med schema error
dc90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dca0: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
dcb0: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
dcc0: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
dcd0: 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b  {..  /* If pWalk
dce0: 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74  er->eCode is 2 t
dcf0: 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20  hen any term of 
dd00: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
dd10: 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20  hat comes from. 
dd20: 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   ** the ON or US
dd30: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
dd40: 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75   left join disqu
dd50: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
dd60: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
dd70: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
dd80: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
dd90: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
dda0: 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61  ode==2 && ExprHa
ddb0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
ddc0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
ddd0: 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
dde0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ode = 0;.    ret
ddf0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
de00: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
de10: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
de20: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
de30: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
de40: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
de50: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
de60: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
de70: 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65  nd either pWalke
de80: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35  r->eCode==4 or 5
de90: 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   or the function
dea0: 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20   has the.    ** 
deb0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53  SQLITE_FUNC_CONS
dec0: 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63  T flag. */.    c
ded0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
dee0: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
def0: 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20  er->eCode>=4 || 
df00: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
df10: 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75  pExpr,EP_ConstFu
df20: 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nc) ){.        r
df30: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
df40: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ue;.      }else{
df50: 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  .        pWalker
df60: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
df70: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
df80: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
df90: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
dfa0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
dfb0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
dfc0: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
dfd0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
dfe0: 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63  UMN:.      testc
dff0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
e000: 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74  TK_ID );.      t
e010: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
e020: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
e030: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e040: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
e050: 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
e060: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
e070: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
e080: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
e090: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
e0a0: 6f 64 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d  ode==3 && pExpr-
e0b0: 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72  >iTable==pWalker
e0c0: 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20  ->u.iCur ){.    
e0d0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
e0e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
e0f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57  else{.        pW
e100: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
e110: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e120: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
e130: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e140: 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
e150: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
e160: 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  de==5 ){.       
e170: 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e   /* Silently con
e180: 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72 61 6d  vert bound param
e190: 65 74 65 72 73 20 74 68 61 74 20 61 70 70 65 61  eters that appea
e1a0: 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52 45 41  r inside of CREA
e1b0: 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  TE.        ** st
e1c0: 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20  atements into a 
e1d0: 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73 69 6e  NULL when parsin
e1e0: 67 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  g the CREATE sta
e1f0: 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75 74 0a  tement text out.
e200: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
e210: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
e220: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
e230: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
e240: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  NULL;.      }els
e250: 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65  e if( pWalker->e
e260: 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20  Code==4 ){.     
e270: 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61     /* A bound pa
e280: 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43 52 45  rameter in a CRE
e290: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ATE statement th
e2a0: 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
e2b0: 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71  om.        ** sq
e2c0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
e2d0: 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72 20  causes an error 
e2e0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  */.        pWalk
e2f0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
e300: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
e310: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
e320: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
e330: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64 65  hrough */.    de
e340: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73  fault:.      tes
e350: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
e360: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f  ==TK_SELECT ); /
e370: 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  * selectNodeIsCo
e380: 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61  nstant will disa
e390: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74 65  llow */.      te
e3a0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
e3b0: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20  p==TK_EXISTS ); 
e3c0: 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43  /* selectNodeIsC
e3d0: 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73  onstant will dis
e3e0: 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72  allow */.      r
e3f0: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
e400: 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ue;.  }.}.static
e410: 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65 49   int selectNodeI
e420: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
e430: 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
e440: 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  t *NotUsed){.  U
e450: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
e460: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c  NotUsed);.  pWal
e470: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
e480: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e490: 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rt;.}.static int
e4a0: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70   exprIsConst(Exp
e4b0: 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c  r *p, int initFl
e4c0: 61 67 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20  ag, int iCur){. 
e4d0: 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
e4e0: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
e4f0: 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65  f(w));.  w.eCode
e500: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
e510: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
e520: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
e530: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
e540: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
e550: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  tNodeIsConstant;
e560: 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 43  .  w.u.iCur = iC
e570: 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ur;.  sqlite3Wal
e580: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
e590: 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
e5a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
e5b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
e5c0: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
e5d0: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
e5e0: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
e5f0: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
e600: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
e610: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
e620: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
e630: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
e640: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
e650: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
e660: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
e670: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
e680: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
e690: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
e6a0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
e6b0: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
e6c0: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
e6d0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
e6e0: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
e6f0: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
e700: 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a  st(p, 1, 0);.}..
e710: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
e720: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
e730: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
e740: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
e750: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
e760: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72   that does no or
e770: 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65  iginate from the
e780: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
e790: 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a  uses of a join..
e7a0: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
e7b0: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
e7c0: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
e7d0: 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20   calls or terms 
e7e0: 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72  from.** an ON or
e7f0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
e800: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
e810: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
e820: 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  in(Expr *p){.  r
e830: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
e840: 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f  t(p, 2, 0);.}../
e850: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
e860: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
e870: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
e880: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e890: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
e8a0: 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65 20 72  for any single r
e8b0: 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ow of the table 
e8c0: 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72  with cursor iCur
e8d0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
e8e0: 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  s, the.** expres
e8f0: 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65  sion must not re
e900: 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64  fer to any non-d
e910: 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e  eterministic fun
e920: 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a  ction nor any.**
e930: 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61   table other tha
e940: 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73  n iCur..*/.int s
e950: 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
e960: 65 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  eConstant(Expr *
e970: 70 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20  p, int iCur){.  
e980: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
e990: 73 74 28 70 2c 20 33 2c 20 69 43 75 72 29 3b 0a  st(p, 3, iCur);.
e9a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
e9b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
e9c0: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
e9d0: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
e9e0: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
e9f0: 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f  .** or a functio
ea00: 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73  n call with cons
ea10: 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
ea20: 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66   Return and 0 if
ea30: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e   there.** are an
ea40: 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  y variables..**.
ea50: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
ea60: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
ea70: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
ea80: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
ea90: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
eaa0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
eab0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
eac0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
ead0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
eae0: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
eaf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
eb00: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
eb10: 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38  tion(Expr *p, u8
eb20: 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65   isInit){.  asse
eb30: 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  rt( isInit==0 ||
eb40: 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20   isInit==1 );.  
eb50: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
eb60: 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20  st(p, 4+isInit, 
eb70: 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  0);.}..#ifdef SQ
eb80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
eb90: 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57  OR_HINTS./*.** W
eba0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
ebb0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
ebc0: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
ebd0: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ion contains a.*
ebe0: 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f  * subquery of so
ebf0: 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e  me kind.  Return
ec00: 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20   0 if there are 
ec10: 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  no subqueries..*
ec20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
ec30: 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72  rContainsSubquer
ec40: 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61  y(Expr *p){.  Wa
ec50: 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
ec60: 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
ec70: 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20  ));.  w.eCode = 
ec80: 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  1;.  w.xExprCall
ec90: 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
eca0: 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
ecb0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
ecc0: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
ecd0: 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65  nstant;.  sqlite
ece0: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
ecf0: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
ed00: 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  de==0;.}.#endif.
ed10: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
ed20: 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73  pression p codes
ed30: 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
ed40: 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
ed50: 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
ed60: 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
ed70: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
ed80: 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
ed90: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
eda0: 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
edb0: 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
edc0: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
edd0: 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
ede0: 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
edf0: 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
ee00: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
ee10: 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
ee20: 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
ee30: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
ee40: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
ee50: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
ee60: 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72  pValue){.  int r
ee70: 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  c = 0;..  /* If 
ee80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
ee90: 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65   an integer lite
eea0: 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e  ral that fits in
eeb0: 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
eec0: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74  .  ** integer, t
eed0: 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61  hen the EP_IntVa
eee0: 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61  lue flag will ha
eef0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
ef00: 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  set */.  assert(
ef10: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47   p->op!=TK_INTEG
ef20: 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20  ER || (p->flags 
ef30: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  & EP_IntValue)!=
ef40: 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
ef50: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
ef60: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63  p->u.zToken, &rc
ef70: 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  )==0 );..  if( p
ef80: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
ef90: 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56  Value ){.    *pV
efa0: 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c  alue = p->u.iVal
efb0: 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ue;.    return 1
efc0: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
efd0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
efe0: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
eff0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f000: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
f010: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
f020: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f030: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f040: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
f050: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
f060: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
f070: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
f080: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  &v) ){.        a
f090: 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37  ssert( v!=(-2147
f0a0: 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20  483647-1) );.   
f0b0: 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d       *pValue = -
f0c0: 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  v;.        rc = 
f0d0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
f0e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f0f0: 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b    default: break
f100: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
f110: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
f120: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72  rn FALSE if ther
f130: 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
f140: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
f150: 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a  on can be NULL..
f160: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
f170: 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65  ression might be
f180: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
f190: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f  expression is to
f1a0: 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20  o complex.** to 
f1b0: 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45  tell return TRUE
f1c0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
f1d0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61  outine is used a
f1e0: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
f1f0: 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73  n, to skip OP_Is
f200: 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20  Null opcodes.** 
f210: 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61  when we know tha
f220: 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  t a value cannot
f230: 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65   be NULL.  Hence
f240: 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  , a false positi
f250: 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  ve.** (returning
f260: 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61   TRUE when in fa
f270: 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ct the expressio
f280: 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e  n can never be N
f290: 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65  ULL) might.** be
f2a0: 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d   a small perform
f2b0: 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20  ance hit but is 
f2c0: 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65  otherwise harmle
f2d0: 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65  ss.  On the othe
f2e0: 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c  r.** hand, a fal
f2f0: 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74  se negative (ret
f300: 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65  urning FALSE whe
f310: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75  n the result cou
f320: 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77  ld be NULL).** w
f330: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
f340: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63  t in an incorrec
f350: 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68  t answer.  So wh
f360: 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
f370: 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a  urn.** TRUE..*/.
f380: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
f390: 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45  anBeNull(const E
f3a0: 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70  xpr *p){.  u8 op
f3b0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
f3c0: 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
f3d0: 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
f3e0: 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
f3f0: 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
f400: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
f410: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
f420: 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
f430: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
f440: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
f450: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
f460: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
f470: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
f480: 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  B:.      return 
f490: 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  0;.    case TK_C
f4a0: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61 73 73  OLUMN:.      ass
f4b0: 65 72 74 28 20 70 2d 3e 70 54 61 62 21 3d 30 20  ert( p->pTab!=0 
f4c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f4d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f4e0: 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29  p, EP_CanBeNull)
f4f0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
f500: 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20   (p->iColumn>=0 
f510: 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  && p->pTab->aCol
f520: 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  [p->iColumn].not
f530: 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65  Null==0);.    de
f540: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
f550: 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
f560: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
f570: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
f580: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e  ression is a con
f590: 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c  stant which woul
f5a0: 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  d be.** unchange
f5b0: 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79  d by OP_Affinity
f5c0: 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69   with the affini
f5d0: 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ty given in the 
f5e0: 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
f5f0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
f600: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
f610: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
f620: 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
f630: 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  peration.** can 
f640: 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65  be omitted.  Whe
f650: 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72  n in doubt retur
f660: 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73  n FALSE.  A fals
f670: 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73  e negative.** is
f680: 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61   harmless.  A fa
f690: 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f  lse positive, ho
f6a0: 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c  wever, can resul
f6b0: 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a  t in the wrong.*
f6c0: 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74  * answer..*/.int
f6d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
f6e0: 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
f6f0: 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c  e(const Expr *p,
f700: 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38   char aff){.  u8
f710: 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d   op;.  if( aff==
f720: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
f730: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68  ) return 1;.  wh
f740: 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
f750: 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  PLUS || p->op==T
f760: 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20  K_UMINUS ){ p = 
f770: 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70  p->pLeft; }.  op
f780: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20   = p->op;.  if( 
f790: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
f7a0: 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
f7b0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
f7c0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
f7d0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
f7e0: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
f7f0: 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
f800: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
f810: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
f820: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
f830: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
f840: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
f850: 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  EAL || aff==SQLI
f860: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
f870: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
f880: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
f890: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
f8a0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
f8b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f8c0: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72  _BLOB: {.      r
f8d0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
f8e0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
f8f0: 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  N: {.      asser
f900: 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20  t( p->iTable>=0 
f910: 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20  );  /* p cannot 
f920: 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45  be part of a CHE
f930: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  CK constraint */
f940: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
f950: 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20  >iColumn<0.     
f960: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
f970: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
f980: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
f990: 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20  AFF_NUMERIC);.  
f9a0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
f9b0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
f9c0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
f9d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
f9e0: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
f9f0: 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
fa00: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
fa10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
fa20: 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
fa30: 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
fa40: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
fa50: 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
fa60: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
fa70: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
fa80: 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
fa90: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
faa0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
fab0: 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
fac0: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
fad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20  .}../*.** pX is 
fae0: 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e  the RHS of an IN
faf0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 70   operator.  If p
fb00: 58 20 69 73 20 61 20 53 45 4c 45 43 54 20 73 74  X is a SELECT st
fb10: 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  atement .** that
fb20: 20 63 61 6e 20 62 65 20 73 69 6d 70 6c 69 66 69   can be simplifi
fb30: 65 64 20 74 6f 20 61 20 64 69 72 65 63 74 20 74  ed to a direct t
fb40: 61 62 6c 65 20 61 63 63 65 73 73 2c 20 74 68 65  able access, the
fb50: 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  n return.** a po
fb60: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53 45 4c  inter to the SEL
fb70: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
fb80: 49 66 20 70 58 20 69 73 20 6e 6f 74 20 61 20 53  If pX is not a S
fb90: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
fba0: 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 53 45  .** or if the SE
fbb0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6e  LECT statement n
fbc0: 65 65 64 73 20 74 6f 20 62 65 20 6d 61 6e 69 66  eeds to be manif
fbd0: 65 73 74 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ested into a tra
fbe0: 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c  nsient.** table,
fbf0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c   then return NUL
fc00: 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  L..*/.#ifndef SQ
fc10: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
fc20: 52 59 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74  RY.static Select
fc30: 20 2a 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72   *isCandidateFor
fc40: 49 6e 4f 70 74 28 45 78 70 72 20 2a 70 58 29 7b  InOpt(Expr *pX){
fc50: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
fc60: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
fc70: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
fc80: 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
fc90: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
fca0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
fcb0: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
fcc0: 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ct) ) return 0; 
fcd0: 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71 75 65   /* Not a subque
fce0: 72 79 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72  ry */.  if( Expr
fcf0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
fd00: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 20 29  EP_VarSelect)  )
fd10: 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
fd20: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 20 2a  orrelated subq *
fd30: 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53  /.  p = pX->x.pS
fd40: 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e  elect;.  if( p->
fd50: 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
fd60: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
fd70: 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  /* Not a compoun
fd80: 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  d SELECT */.  if
fd90: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
fda0: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
fdb0: 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
fdc0: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
fdd0: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
fde0: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
fdf0: 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
fe00: 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  nct );.    testc
fe10: 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
fe20: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
fe30: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
fe40: 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
fe50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
fe60: 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65  * No DISTINCT ke
fe70: 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67  yword and no agg
fe80: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
fe90: 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
fea0: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
feb0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
fec0: 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50   /* Has no GROUP
fed0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
fee0: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20  if( p->pLimit ) 
fef0: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
ff00: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
ff10: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
ff20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
ff30: 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
ff40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
ff50: 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f  LIMIT means no O
ff60: 46 46 53 45 54 20 2a 2f 0a 20 20 69 66 28 20 70  FFSET */.  if( p
ff70: 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
ff80: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
ff90: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52    /* Has no WHER
ffa0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53  E clause */.  pS
ffb0: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
ffc0: 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
ffd0: 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  );.  if( pSrc->n
ffe0: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
fff0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  0;          /* S
10000 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52  ingle term in FR
10010 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
10020 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  f( pSrc->a[0].pS
10030 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30  elect ) return 0
10040 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73  ;     /* FROM is
10050 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   not a subquery 
10060 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61  or view */.  pTa
10070 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
10080 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Tab;.  assert( p
10090 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Tab!=0 );.  asse
100a0 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
100b0 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
100c0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
100d0 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
100e0 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
100f0 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
10100 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  n 0;        /* F
10110 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61  ROM clause not a
10120 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
10130 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
10140 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
10150 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
10160 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72   /* All SELECT r
10170 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63  esults must be c
10180 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72  olumns. */.  for
10190 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
101a0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
101b0 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45   Expr *pRes = pE
101c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
101d0 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e  ;.    if( pRes->
101e0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
101f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73  return 0;.    as
10200 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62  sert( pRes->iTab
10210 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69  le==pSrc->a[0].i
10220 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f  Cursor );  /* No
10230 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  t a correlated s
10240 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20  ubquery */.  }. 
10250 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e   return p;.}.#en
10260 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10270 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
10280 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
10290 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f  _Once instructio
102a0 6e 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73  n and allocate s
102b0 70 61 63 65 20 66 6f 72 20 69 74 73 20 66 6c 61  pace for its fla
102c0 67 2e 20 52 65 74 75 72 6e 20 74 68 65 20 0a 2a  g. Return the .*
102d0 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
102e0 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
102f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10300 43 6f 64 65 4f 6e 63 65 28 50 61 72 73 65 20 2a  CodeOnce(Parse *
10310 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
10320 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
10330 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
10340 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
10350 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
10360 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   */.  return sql
10370 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10380 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72 73  , OP_Once, pPars
10390 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a  e->nOnce++);.}..
103a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
103b0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
103c0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
103d0 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68 65   that checks the
103e0 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
103f0 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65  n of index table
10400 20 69 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a   iCur to see if.
10410 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61  ** it contains a
10420 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e  ny NULL entries.
10430 20 20 43 61 75 73 65 20 74 68 65 20 72 65 67 69    Cause the regi
10440 73 74 65 72 20 61 74 20 72 65 67 48 61 73 4e 75  ster at regHasNu
10450 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20  ll to be set.** 
10460 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  to a non-NULL va
10470 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74  lue if iCur cont
10480 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20  ains no NULLs.  
10490 43 61 75 73 65 20 72 65 67 69 73 74 65 72 20 72  Cause register r
104a0 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20  egHasNull.** to 
104b0 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  be set to NULL i
104c0 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  f iCur contains 
104d0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c  one or more NULL
104e0 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74   values..*/.stat
104f0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
10500 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64  etHasNullFlag(Vd
10510 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c  be *v, int iCur,
10520 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29   int regHasNull)
10530 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20  {.  int addr1;. 
10540 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10550 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
10560 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29  , 0, regHasNull)
10570 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
10580 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
10590 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
105a0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
105b0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
105c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
105d0 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72  lumn, iCur, 0, r
105e0 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71  egHasNull);.  sq
105f0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
10600 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45  5(v, OPFLAG_TYPE
10610 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f  OFARG);.  VdbeCo
10620 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74  mment((v, "first
10630 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20  _entry_in(%d)", 
10640 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65  iCur));.  sqlite
10650 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10660 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69   addr1);.}.#endi
10670 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
10680 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
10690 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
106a0 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ent is an IN ope
106b0 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73  rator with a lis
106c0 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t (not a subquer
106d0 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69  y) on the .** ri
106e0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20  ght-hand side.  
106f0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
10700 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73  hat list is cons
10710 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tant..*/.static 
10720 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73  int sqlite3InRhs
10730 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
10740 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70  *pIn){.  Expr *p
10750 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  LHS;.  int res;.
10760 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
10770 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20  asProperty(pIn, 
10780 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
10790 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70  .  pLHS = pIn->p
107a0 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65  Left;.  pIn->pLe
107b0 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20  ft = 0;.  res = 
107c0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
107d0 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49  stant(pIn);.  pI
107e0 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b  n->pLeft = pLHS;
107f0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
10800 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
10810 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
10820 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
10830 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
10840 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
10850 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70  tor..** The pX p
10860 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
10870 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68  expression on th
10880 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
10890 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a  operator, which.
108a0 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74 68  ** might be eith
108b0 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70  er a list of exp
108c0 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75  ressions or a su
108d0 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
108e0 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
108f0 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64  utine is to find
10900 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74   or create a b-t
10910 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ree object that 
10920 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65  can.** be used e
10930 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f  ither to test fo
10940 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20  r membership in 
10950 74 68 65 20 52 48 53 20 73 65 74 20 6f 72 20 74  the RHS set or t
10960 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
10970 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73  h.** all members
10980 20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74 2c   of the RHS set,
10990 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63   skipping duplic
109a0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75  ates..**.** A cu
109b0 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  rsor is opened o
109c0 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  n the b-tree obj
109d0 65 63 74 20 74 68 61 74 20 69 73 20 74 68 65 20  ect that is the 
109e0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
109f0 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58  erator.** and pX
10a00 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  ->iTable is set 
10a10 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
10a20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a  that cursor..**.
10a30 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
10a40 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
10a50 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73  nction indicates
10a60 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65   the b-tree type
10a70 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
10a80 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52  .**   IN_INDEX_R
10a90 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68 65 20  OWID      - The 
10aa0 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
10ab0 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  d on a database 
10ac0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
10ad0 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20  NDEX_INDEX_ASC  
10ae0 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
10af0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73   opened on an as
10b00 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
10b10 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
10b20 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75  EX_DESC - The cu
10b30 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
10b40 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
10b50 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
10b60 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20 20 20  NDEX_EPH        
10b70 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
10b80 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65   opened on a spe
10b90 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61  cially created a
10ba0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
10bc0 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61  pulated epherema
10bd0 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  l table..**   IN
10be0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20  _INDEX_NOOP     
10bf0 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61    - No cursor wa
10c00 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68  s allocated.  Th
10c10 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75  e IN operator mu
10c20 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  st be.**        
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c40 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
10c50 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f  a sequence of co
10c60 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  mparisons..**.**
10c70 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74   An existing b-t
10c80 72 65 65 20 6d 69 67 68 74 20 62 65 20 75 73 65  ree might be use
10c90 64 20 69 66 20 74 68 65 20 52 48 53 20 65 78 70  d if the RHS exp
10ca0 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20  ression pX is a 
10cb0 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65  simple.** subque
10cc0 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a  ry such as:.**.*
10cd0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f  *     SELECT <co
10ce0 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32  lumn1>, <column2
10cf0 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  >... FROM <table
10d00 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52  >.**.** If the R
10d10 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
10d20 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
10d30 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  or a more comple
10d40 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  x subquery, then
10d50 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  .** an ephemeral
10d60 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65   table might nee
10d70 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  d to be generate
10d80 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61  d from the RHS a
10d90 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69  nd then.** pX->i
10da0 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f  Table made to po
10db0 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d  int to the ephem
10dc0 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65  eral table inste
10dd0 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73  ad of an.** exis
10de0 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  ting table..**.*
10df0 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61  * The inFlags pa
10e00 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e  rameter must con
10e10 74 61 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65  tain exactly one
10e20 20 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20   of the bits.** 
10e30 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
10e40 48 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f  HIP or IN_INDEX_
10e50 4c 4f 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61 67  LOOP.  If inFlag
10e60 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e  s contains.** IN
10e70 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
10e80 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65  P, then the gene
10e90 72 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c  rated table will
10ea0 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 0a 2a   be used for a.*
10eb0 2a 20 66 61 73 74 20 6d 65 6d 62 65 72 73 68 69  * fast membershi
10ec0 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68  p test.  When th
10ed0 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  e IN_INDEX_LOOP 
10ee0 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 0a  bit is set, the.
10ef0 2a 2a 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c  ** IN index will
10f00 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70   be used to loop
10f10 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73   over all values
10f20 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   of the RHS of t
10f30 68 65 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f  he.** IN operato
10f40 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e  r..**.** When IN
10f50 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75  _INDEX_LOOP is u
10f60 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74  sed (and the b-t
10f70 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
10f80 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74   to iterate.** t
10f90 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d  hrough the set m
10fa0 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65  embers) then the
10fb0 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74   b-tree must not
10fc0 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61   contain duplica
10fd0 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72  tes..** An epher
10fe0 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
10ff0 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74  be used unless t
11000 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75  he selected colu
11010 6d 6e 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  mns are guarante
11020 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71  ed.** to be uniq
11030 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61  ue - either beca
11040 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54  use it is an INT
11050 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
11060 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20 61 20   or due to.** a 
11070 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
11080 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  t or index..**.*
11090 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
110a0 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20 75 73  MEMBERSHIP is us
110b0 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
110c0 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
110d0 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74  .** for fast set
110e0 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
110f0 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72  s) then an epher
11100 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
11110 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65  .** be used unle
11120 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73 20  ss <columns> is 
11130 61 20 73 69 6e 67 6c 65 20 49 4e 54 45 47 45 52  a single INTEGER
11140 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
11150 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e  umn or an .** in
11160 64 65 78 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  dex can be found
11170 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
11180 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73  ied <columns> as
11190 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a   its left-most..
111a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f  **.** If the IN_
111b0 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e  INDEX_NOOP_OK an
111c0 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  d IN_INDEX_MEMBE
111d0 52 53 48 49 50 20 61 72 65 20 62 6f 74 68 20 73  RSHIP are both s
111e0 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65  et and.** if the
111f0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
11200 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
11210 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t (not a subquer
11220 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  y) then this.** 
11230 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65  routine might de
11240 63 69 64 65 20 74 68 61 74 20 63 72 65 61 74 69  cide that creati
11250 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
11260 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65  b-tree for membe
11270 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67  rship.** testing
11280 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76   is too expensiv
11290 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f  e and return IN_
112a0 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20  INDEX_NOOP.  In 
112b0 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a  that case, the.*
112c0 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
112d0 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65  e should impleme
112e0 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  nt the IN operat
112f0 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71 75 65  or using a seque
11300 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20  nce.** of Eq or 
11310 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  Ne comparison op
11320 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
11330 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  When the b-tree 
11340 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  is being used fo
11350 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
11360 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ts, the calling 
11370 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68  function.** migh
11380 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77  t need to know w
11390 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
113a0 65 20 52 48 53 20 73 69 64 65 20 6f 66 20 74 68  e RHS side of th
113b0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
113c0 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c   contains a NULL
113d0 2e 20 20 49 66 20 70 72 52 68 73 48 61 73 4e 75  .  If prRhsHasNu
113e0 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c  ll is not a NULL
113f0 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a   pointer and .**
11400 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
11410 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
11420 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e   (...) might con
11430 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75  tain a NULL valu
11440 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c  e at.** runtime,
11450 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72   then a register
11460 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
11470 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  d the register n
11480 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a  umber written.**
11490 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c   to *prRhsHasNul
114a0 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  l. If there is n
114b0 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
114c0 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73  e (...) contains
114d0 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65   a.** NULL value
114e0 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73  , then *prRhsHas
114f0 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63  Null is left unc
11500 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
11510 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
11520 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73  llocated and its
11530 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64   location stored
11540 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c   in *prRhsHasNul
11550 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76  l, then.** the v
11560 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65 67  alue in that reg
11570 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55  ister will be NU
11580 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  LL if the b-tree
11590 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
115a0 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61   more.** NULL va
115b0 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c  lues, and it wil
115c0 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55  l be some non-NU
115d0 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65 20  LL value if the 
115e0 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20  b-tree contains 
115f0 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  no.** NULL value
11600 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
11610 61 69 4d 61 70 20 70 61 72 61 6d 65 74 65 72 20  aiMap parameter 
11620 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
11630 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  must point to an
11640 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e   array containin
11650 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  g.** one element
11660 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
11670 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
11680 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11690 74 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a 2a 20  t on the RHS.** 
116a0 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f  of the IN(...) o
116b0 70 65 72 61 74 6f 72 2e 20 54 68 65 20 69 27 74  perator. The i't
116c0 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 61  h entry of the a
116d0 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65  rray is populate
116e0 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6f 66  d with the.** of
116f0 66 73 65 74 20 6f 66 20 74 68 65 20 69 6e 64 65  fset of the inde
11700 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61  x column that ma
11710 74 63 68 65 73 20 74 68 65 20 69 27 74 68 20 63  tches the i'th c
11720 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62  olumn returned b
11730 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e  y the.** SELECT.
11740 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
11750 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11760 61 6e 64 20 73 65 6c 65 63 74 65 64 20 69 6e 64  and selected ind
11770 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ex are:.**.**   
11780 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45  (?,?,?) IN (SELE
11790 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  CT a, b, c FROM 
117a0 74 31 29 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  t1).**   CREATE 
117b0 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62  INDEX i1 ON t1(b
117c0 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74  , c, a);.**.** t
117d0 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73 20 70  hen aiMap[] is p
117e0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 7b 32  opulated with {2
117f0 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e  , 0, 1}..*/.#ifn
11800 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11810 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
11820 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
11830 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11840 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
11850 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
11860 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 2c 20   */.  Expr *pX, 
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61   /* The right-ha
11890 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 6f 66  nd side (RHS) of
118a0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
118b0 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c 61 67   */.  u32 inFlag
118c0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
118d0 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f   /* IN_INDEX_LOO
118e0 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20  P, _MEMBERSHIP, 
118f0 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20  and/or _NOOP_OK 
11900 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68 73 48  */.  int *prRhsH
11910 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20  asNull,         
11920 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
11930 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75 73 2e  ing NULL status.
11940 20 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f 0a 20    See notes */. 
11950 20 69 6e 74 20 2a 61 69 4d 61 70 20 20 20 20 20   int *aiMap     
11960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
11970 61 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e 64 65  apping from Inde
11980 78 20 66 69 65 6c 64 73 20 74 6f 20 52 48 53 20  x fields to RHS 
11990 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 53  fields */.){.  S
119a0 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20  elect *p;       
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119c0 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74       /* SELECT t
119d0 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49  o the right of I
119e0 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
119f0 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20  int eType = 0;  
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a10 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
11a20 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49   RHS table. IN_I
11a30 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20  NDEX_* */.  int 
11a40 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
11a50 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  Tab++;          
11a60 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74    /* Cursor of t
11a70 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a  he RHS table */.
11a80 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71    int mustBeUniq
11a90 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
11aa0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
11ab0 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75  if RHS must be u
11ac0 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20  nique */.  Vdbe 
11ad0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
11ae0 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
11af0 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68   /* Virtual mach
11b00 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ine being coded 
11b10 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58  */..  assert( pX
11b20 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
11b30 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20   mustBeUnique = 
11b40 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e  (inFlags & IN_IN
11b50 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20  DEX_LOOP)!=0;.. 
11b60 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f   /* If the RHS o
11b70 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f  f this IN(...) o
11b80 70 65 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c  perator is a SEL
11b90 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d  ECT, and if it m
11ba0 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65  atters .  ** whe
11bb0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
11bc0 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f  SELECT result co
11bd0 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
11be0 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65  es, check whethe
11bf0 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55  r.  ** or not NU
11c00 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70  LL is actually p
11c10 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20  ossible (it may 
11c20 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d  not be, for exam
11c30 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74  ple, due .  ** t
11c40 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  o NOT NULL const
11c50 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63  raints in the sc
11c60 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c  hema). If no NUL
11c70 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73  L values are pos
11c80 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20  sible,.  ** set 
11c90 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20  prRhsHasNull to 
11ca0 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  0 before continu
11cb0 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
11cc0 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28  rRhsHasNull && (
11cd0 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pX->flags & EP_x
11ce0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
11cf0 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72   int i;.    Expr
11d00 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
11d10 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  X->x.pSelect->pE
11d20 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
11d30 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
11d40 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
11d50 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
11d60 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d  anBeNull(pEList-
11d70 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62  >a[i].pExpr) ) b
11d80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11d90 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e  if( i==pEList->n
11da0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72  Expr ){.      pr
11db0 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a  RhsHasNull = 0;.
11dc0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11dd0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
11de0 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
11df0 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62  e or index can b
11e00 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73  e used to.  ** s
11e10 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79  atisfy the query
11e20 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65  .  This is prefe
11e30 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74  rable to generat
11e40 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20  ing a new .  ** 
11e50 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
11e60 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
11e70 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70  e->nErr==0 && (p
11e80 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f   = isCandidateFo
11e90 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29  rInOpt(pX))!=0 )
11ea0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
11eb0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ed0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
11ee0 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
11ef0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c    /* Table <tabl
11f20 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69  e>. */.    i16 i
11f30 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f50 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64    /* Database id
11f60 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  x for pTab */.  
11f70 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
11f80 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
11f90 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
11fa0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
11fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
11fc0 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
11fd0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
11fe0 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
11ff0 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
12000 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12010 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
12020 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
12030 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
12040 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
12050 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12060 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
12070 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
12080 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
12090 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
120a0 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
120b0 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
120c0 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f      /* Code an O
120d0 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  P_Transaction an
120e0 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66  d OP_TableLock f
120f0 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  or <table>. */. 
12100 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
12110 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
12120 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
12130 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
12140 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
12150 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
12160 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
12170 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
12180 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
12190 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
121a0 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a 20 73  assert(v);  /* s
121b0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
121c0 68 61 73 20 61 6c 77 61 79 73 20 62 65 65 6e 20  has always been 
121d0 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
121e0 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 78  d */.    if( nEx
121f0 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d  pr==1 && pEList-
12200 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[0].pExpr->iCo
12210 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
12220 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28 53 45  /* The "x IN (SE
12230 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
12240 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a  table)" case */.
12250 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
12260 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
12270 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
12280 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12290 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
122a0 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
122b0 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
122c0 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
122d0 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49  .      eType = I
122e0 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a  N_INDEX_ROWID;..
122f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12300 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
12310 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
12320 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
12330 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
12340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
12350 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
12360 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  */.      int aff
12370 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20  inity_ok = 1;.  
12380 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
12390 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
123a0 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  the affinity tha
123b0 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
123c0 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20 0a  o perform each .
123d0 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69        ** compari
123e0 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20  son is the same 
123f0 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  as the affinity 
12400 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69  of each column i
12410 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  n table.      **
12420 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
12430 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20  he IN operator. 
12440 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20 69   If it not, it i
12450 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
12460 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 61  o.      ** use a
12470 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ny index of the 
12480 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  RHS table.  */. 
12490 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
124a0 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69 74  nExpr && affinit
124b0 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  y_ok; i++){.    
124c0 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d      Expr *pLhs =
124d0 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
124e0 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70  eldSubexpr(pX->p
124f0 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
12500 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c    int iCol = pEL
12510 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d  ist->a[i].pExpr-
12520 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
12530 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d 20    char idxaff = 
12540 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75  sqlite3TableColu
12550 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62 2c  mnAffinity(pTab,
12560 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61  iCol); /* RHS ta
12570 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ble */.        c
12580 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71 6c  har cmpaff = sql
12590 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
125a0 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66 66  ity(pLhs, idxaff
125b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
125c0 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c  ase( cmpaff==SQL
125d0 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a  ITE_AFF_BLOB );.
125e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
125f0 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45  ( cmpaff==SQLITE
12600 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
12610 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d 70       switch( cmp
12620 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  aff ){.         
12630 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
12640 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20  _BLOB:.         
12650 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12660 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
12670 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
12680 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
12690 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
126a0 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 54  ) only returns T
126b0 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65 20  EXT if one side 
126c0 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  or the.         
126d0 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73 20     ** other has 
126e0 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20  no affinity and 
126f0 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20 69  the other side i
12700 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a  s TEXT.  Hence,.
12710 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
12720 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20  he only way for 
12730 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45 58  cmpaff to be TEX
12740 54 20 69 73 20 66 6f 72 20 69 64 78 61 66 66 20  T is for idxaff 
12750 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20 20  to be TEXT.     
12760 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f         ** and fo
12770 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74 68  r the term on th
12780 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
12790 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69 6e  to have no affin
127a0 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ity. */.        
127b0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 61      assert( idxa
127c0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
127d0 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20  EXT );.         
127e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
127f0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
12800 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
12810 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 73  y_ok = sqlite3Is
12820 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
12830 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20  idxaff);.       
12840 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
12850 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f    if( affinity_o
12860 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
12870 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
12880 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  isting index tha
12890 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20  t will work for 
128a0 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72  this IN operator
128b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
128c0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
128d0 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65  x; pIdx && eType
128e0 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  ==0; pIdx=pIdx->
128f0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
12900 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65    Bitmask colUse
12910 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  d;      /* Colum
12920 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ns of the index 
12930 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  used */.        
12940 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20    Bitmask mCol; 
12950 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
12960 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
12970 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20  column */.      
12980 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
12990 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f  olumn<nExpr ) co
129a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
129b0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f    /* Maximum nCo
129c0 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e  lumn is BMS-2, n
129d0 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61  ot BMS-1, so tha
129e0 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65  t we can compute
129f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49  .          ** BI
12a00 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74  TMASK(nExpr) wit
12a10 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67  hout overflowing
12a20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
12a30 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43  stcase( pIdx->nC
12a40 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a  olumn==BMS-2 );.
12a50 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
12a60 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  se( pIdx->nColum
12a70 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  n==BMS-1 );.    
12a80 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
12a90 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29  nColumn>=BMS-1 )
12aa0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12ab0 20 20 20 20 20 69 66 28 20 6d 75 73 74 42 65 55       if( mustBeU
12ac0 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20  nique ){.       
12ad0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
12ae0 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20  KeyCol>nExpr.   
12af0 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64            ||(pId
12b00 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72  x->nColumn>nExpr
12b10 20 26 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64   && !IsUniqueInd
12b20 65 78 28 70 49 64 78 29 29 0a 20 20 20 20 20 20  ex(pIdx)).      
12b30 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
12b40 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
12b50 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
12b60 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76  is not unique ov
12b70 65 72 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f  er the IN RHS co
12b80 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  lumns */.       
12b90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12ba0 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20   }.  .          
12bb0 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f  colUsed = 0;   /
12bc0 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64  * Columns of ind
12bd0 65 78 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a  ex used so far *
12be0 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
12bf0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
12c00 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
12c10 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c  Expr *pLhs = sql
12c20 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
12c30 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74  ubexpr(pX->pLeft
12c40 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
12c50 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70    Expr *pRhs = p
12c60 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
12c70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  r;.            C
12c80 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73  ollSeq *pReq = s
12c90 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
12ca0 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
12cb0 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a  e, pLhs, pRhs);.
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
12cd0 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  j;.  .          
12ce0 20 20 61 73 73 65 72 74 28 20 70 52 65 71 21 3d    assert( pReq!=
12cf0 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75  0 || pRhs->iColu
12d00 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20  mn==XN_ROWID || 
12d10 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
12d20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
12d30 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b  j=0; j<nExpr; j+
12d40 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
12d50 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
12d60 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69  lumn[j]!=pRhs->i
12d70 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
12d80 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
12d90 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
12da0 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20  zColl[j] );.    
12db0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
12dc0 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  eq!=0 && sqlite3
12dd0 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e  StrICmp(pReq->zN
12de0 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ame, pIdx->azCol
12df0 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20  l[j])!=0 ){.    
12e00 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
12e10 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
12e20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12e30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12e50 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70       if( j==nExp
12e60 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
12e70 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41         mCol = MA
12e80 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20  SKBIT(j);.      
12e90 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c 20 26        if( mCol &
12ea0 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65 61 6b   colUsed ) break
12eb0 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e  ; /* Each column
12ec0 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20   used only once 
12ed0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  */.            c
12ee0 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a  olUsed |= mCol;.
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12f00 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d  aiMap ) aiMap[i]
12f10 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
12f20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 61  }.  .          a
12f30 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70 72 20  ssert( i==nExpr 
12f40 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53  || colUsed!=(MAS
12f50 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29  KBIT(nExpr)-1) )
12f60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
12f70 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49  colUsed==(MASKBI
12f80 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a 20  T(nExpr)-1) ){. 
12f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
12fa0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
12fb0 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
12fc0 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 20   the index pIdx 
12fd0 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20  is usable */.   
12fe0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64           int iAd
12ff0 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
13000 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
13010 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
13020 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
13030 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20  OMIT_EXPLAIN.   
13040 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13050 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13060 5f 45 78 70 6c 61 69 6e 2c 20 30 2c 20 30 2c 20  _Explain, 0, 0, 
13070 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
13080 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13090 64 62 2c 20 22 55 53 49 4e 47 20 49 4e 44 45 58  db, "USING INDEX
130a0 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41   %s FOR IN-OPERA
130b0 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65  TOR",pIdx->zName
130c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
130d0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
130e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
130f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13100 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
13110 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
13120 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
13130 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13140 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
13150 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
13160 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
13170 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
13180 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
13190 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
131a0 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
131b0 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
131c0 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
131d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
131e0 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
131f0 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64  _INDEX_ASC + pId
13200 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
13210 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  ;.  .           
13220 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
13230 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
13240 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c     *prRhsHasNull
13250 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13260 6d 3b 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  m;.  #ifdef SQLI
13270 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
13280 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
13290 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61 73           i64 mas
132a0 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31  k = (1<<nExpr)-1
132b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
132c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
132d0 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
132e0 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20  mnsUsed, .      
132f0 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
13300 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61  , 0, 0, (u8*)&ma
13310 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  sk, P4_INT64);. 
13320 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20   #endif.        
13330 20 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d        if( nExpr=
13340 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
13350 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
13360 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69  HasNullFlag(v, i
13370 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75  Tab, *prRhsHasNu
13380 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
13390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
133a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
133b0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
133c0 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
133d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
133e0 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
133f0 6f 76 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a  over indexes */.
13400 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69        } /* End i
13410 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29  f( affinity_ok )
13420 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64   */.    } /* End
13430 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64   if not an rowid
13440 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a   index */.  } /*
13450 20 45 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20   End attempt to 
13460 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61  optimize using a
13470 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a  n index */..  /*
13480 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69   If no preexisti
13490 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69  ng index is avai
134a0 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e  lable for the IN
134b0 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64   clause.  ** and
134c0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
134d0 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70  s an allowed rep
134e0 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ly.  ** and the 
134f0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
13500 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
13510 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  , not a subquery
13520 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
13530 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  S is not constan
13540 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20  t or has two or 
13550 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a  fewer terms,.  *
13560 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
13570 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20   worth creating 
13580 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
13590 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20  le to evaluate. 
135a0 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61   ** the IN opera
135b0 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e  tor so return IN
135c0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a  _INDEX_NOOP..  *
135d0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  /.  if( eType==0
135e0 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20  .   && (inFlags 
135f0 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  & IN_INDEX_NOOP_
13600 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48  OK).   && !ExprH
13610 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
13620 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20  P_xIsSelect).   
13630 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68  && (!sqlite3InRh
13640 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20  sIsConstant(pX) 
13650 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pX->x.pList->
13660 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20  nExpr<=2).  ){. 
13670 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
13680 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  DEX_NOOP;.  }.. 
13690 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b   if( eType==0 ){
136a0 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f  .    /* Could no
136b0 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69  t find an existi
136c0 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
136d0 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  x to use as the 
136e0 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20  RHS b-tree..    
136f0 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20  ** We will have 
13700 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  to generate an e
13710 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
13720 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20  o do the job..  
13730 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76    */.    u32 sav
13740 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
13750 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
13760 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48  p;.    int rMayH
13770 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  aveNull = 0;.   
13780 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
13790 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69  X_EPH;.    if( i
137a0 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
137b0 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  X_LOOP ){.      
137c0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
137d0 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  op = 0;.      if
137e0 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  ( pX->pLeft->iCo
137f0 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48  lumn<0 && !ExprH
13800 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
13810 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
13820 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
13830 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
13840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
13850 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75  e if( prRhsHasNu
13860 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52  ll ){.      *prR
13870 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79  hsHasNull = rMay
13880 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  HaveNull = ++pPa
13890 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
138a0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
138b0 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
138c0 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75  , pX, rMayHaveNu
138d0 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  ll, eType==IN_IN
138e0 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20  DEX_ROWID);.    
138f0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
13900 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79  op = savedNQuery
13910 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Loop;.  }else{. 
13920 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20     pX->iTable = 
13930 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  iTab;.  }..  if(
13940 20 61 69 4d 61 70 20 26 26 20 65 54 79 70 65 21   aiMap && eType!
13950 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
13960 41 53 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e  ASC && eType!=IN
13970 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
13980 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  C ){.    int i, 
13990 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  n;.    n = sqlit
139a0 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
139b0 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
139c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
139d0 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69  ++) aiMap[i] = i
139e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  ;.  }.  return e
139f0 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Type;.}.#endif..
13a00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13a10 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
13a20 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70  ** Argument pExp
13a30 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e  r is an (?, ?...
13a40 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73  ) IN(...) expres
13a50 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66  sion. This .** f
13a60 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
13a70 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
13a80 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
13a90 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
13aa0 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74   .** the affinit
13ab0 69 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 66  ies to be used f
13ac0 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
13ad0 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
13ae0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68  ..**.** It is th
13af0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
13b00 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
13b10 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
13b20 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74  e returned.** st
13b30 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c  ring is eventual
13b40 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 73  ly freed using s
13b50 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a  qlite3DbFree()..
13b60 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
13b70 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50  exprINAffinity(P
13b80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
13b90 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78  pr *pExpr){.  Ex
13ba0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
13bb0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20  r->pLeft;.  int 
13bc0 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  nVal = sqlite3Ex
13bd0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65  prVectorSize(pLe
13be0 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ft);.  Select *p
13bf0 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d  Select = (pExpr-
13c00 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
13c10 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e  elect) ? pExpr->
13c20 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20  x.pSelect : 0;. 
13c30 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20   char *zRet;..  
13c40 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
13c50 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52  p==TK_IN );.  zR
13c60 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  et = sqlite3DbMa
13c70 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
13c80 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20  >db, nVal+1);.  
13c90 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20  if( zRet ){.    
13ca0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
13cb0 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29  =0; i<nVal; i++)
13cc0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 41  {.      Expr *pA
13cd0 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
13ce0 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65  FieldSubexpr(pLe
13cf0 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68  ft, i);.      ch
13d00 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78  ar a = sqlite3Ex
13d10 70 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a  prAffinity(pA);.
13d20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 65 63        if( pSelec
13d30 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  t ){.        zRe
13d40 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f  t[i] = sqlite3Co
13d50 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 53  mpareAffinity(pS
13d60 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
13d70 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20  [i].pExpr, a);. 
13d80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13d90 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b      zRet[i] = a;
13da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13db0 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20     zRet[nVal] = 
13dc0 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75  '\0';.  }.  retu
13dd0 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn zRet;.}.#endi
13de0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
13df0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
13e00 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50  /*.** Load the P
13e10 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73  arse object pass
13e20 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
13e30 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e  argument with an
13e40 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61   error .** messa
13e50 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ge of the form:.
13e60 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c  **.**   "sub-sel
13e70 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f  ect returns N co
13e80 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
13e90 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73   M".*/   .void s
13ea0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
13eb0 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  rror(Parse *pPar
13ec0 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c  se, int nActual,
13ed0 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20   int nExpect){. 
13ee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
13ef0 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20  t = "sub-select 
13f00 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d  returns %d colum
13f10 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 25 64  ns - expected %d
13f20 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  ";.  sqlite3Erro
13f30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d  rMsg(pParse, zFm
13f40 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70  t, nActual, nExp
13f50 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ect);.}.#endif..
13f60 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
13f70 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
13f80 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
13f90 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70  s a subquery exp
13fa0 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c  ression, EXISTS,
13fb0 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74  .** or IN operat
13fc0 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
13fd0 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
13fe0 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
13ff0 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
14000 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
14010 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
14020 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
14030 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
14040 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
14050 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
14060 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
14070 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
14080 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
14090 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
140a0 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
140b0 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
140c0 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
140d0 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
140e0 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
140f0 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
14100 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
14110 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
14120 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
14130 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
14140 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e  ter isRowid is n
14150 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78  on-zero, then ex
14160 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
14170 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
14180 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  to be of the for
14190 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f  m "<rowid> IN (?
141a0 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20  , ?, ?)", where 
141b0 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66  <rowid> is a ref
141c0 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d  erence.** to som
141d0 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f  e integer key co
141e0 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20  lumn of a table 
141f0 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
14200 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20  case, use an.** 
14210 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f  intkey B-Tree to
14220 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
14230 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73  f IN(...) values
14240 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
14250 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72  usual.** (slower
14260 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  ) variable lengt
14270 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a  h keys B-Tree..*
14280 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65  *.** If rMayHave
14290 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Null is non-zero
142a0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
142b0 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  t the operation 
142c0 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74  is an IN.** (not
142d0 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
142e0 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68  STS) and that th
142f0 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74  e RHS might cont
14300 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41  ains NULLs..** A
14310 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
14320 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69  does is initiali
14330 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ze the register 
14340 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76  given by rMayHav
14350 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c  eNull.** to NULL
14360 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69  .  Calling routi
14370 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61  nes will take ca
14380 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74  re of changing t
14390 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  his register.** 
143a0 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c  value to non-NUL
143b0 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  L if the RHS is 
143c0 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a  NULL-free..**.**
143d0 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72   For a SELECT or
143e0 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
143f0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67  , return the reg
14400 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
14410 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20   the.** result. 
14420 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c   For a multi-col
14430 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65 20  umn SELECT, the 
14440 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
14450 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73   in a contiguous
14460 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67  .** array of reg
14470 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 72  isters and the r
14480 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
14490 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  he register of t
144a0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20  he left-most.** 
144b0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20  result column.  
144c0 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e 20  Return 0 for IN 
144d0 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20  operators or if 
144e0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
144f0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
14500 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
14510 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
14520 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72  Subselect(.  Par
14530 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
14540 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
14550 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
14560 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
14570 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20       /* The IN, 
14580 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54  SELECT, or EXIST
14590 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  S operator */.  
145a0 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  int rHasNullFlag
145b0 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ,       /* Regis
145c0 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73  ter that records
145d0 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65   whether NULLs e
145e0 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20  xist in RHS */. 
145f0 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20   int isRowid    
14600 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
14610 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f  rue, LHS of IN o
14620 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77  perator is a row
14630 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  id */.){.  int j
14640 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
14650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14660 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
14670 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
14680 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
14690 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
146b0 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67  Register storing
146c0 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20   resulting */.  
146d0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
146e0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
146f0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
14700 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
14710 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
14720 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
14730 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61  .  /* The evalua
14740 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f 45  tion of the IN/E
14750 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73  XISTS/SELECT mus
14760 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76  t be repeated ev
14770 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a  ery time it.  **
14780 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
14790 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
147a0 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
147b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
147c0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
147d0 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
147e0 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
147f0 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
14800 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
14810 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
14820 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
14830 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
14840 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
14850 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
14860 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
14870 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
14880 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
14890 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
148a0 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
148b0 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
148c0 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
148d0 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
148e0 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
148f0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
14900 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14910 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
14920 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49  ect) ){.    jmpI
14930 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74  fDynamic = sqlit
14940 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
14950 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
14960 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  (v);.  }..#ifnde
14970 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
14980 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72  PLAIN.  if( pPar
14990 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
149a0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  {.    char *zMsg
149b0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
149c0 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45  f(pParse->db, "E
149d0 58 45 43 55 54 45 20 25 73 25 73 20 53 55 42 51  XECUTE %s%s SUBQ
149e0 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20  UERY %d",.      
149f0 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d    jmpIfDynamic>=
14a00 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44  0?"":"CORRELATED
14a10 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70   ",.        pExp
14a20 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49  r->op==TK_IN?"LI
14a30 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a 20 20  ST":"SCALAR",.  
14a40 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 4e        pParse->iN
14a50 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20  extSelectId.    
14a60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14a70 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
14a80 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
14a90 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
14aa0 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
14ab0 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  C);.  }.#endif..
14ac0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
14ad0 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
14ae0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
14af0 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
14b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
14b10 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
14b20 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
14b30 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ction */.      E
14b40 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
14b50 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68  pr->pLeft; /* th
14b60 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
14b70 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
14b80 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
14b90 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  nfo = 0;      /*
14ba0 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   Key information
14bb0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56   */.      int nV
14bc0 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
14bd0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
14be0 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f   vector pLeft */
14bf0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 56  .      .      nV
14c00 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
14c10 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
14c20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14c30 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61   !isRowid || nVa
14c40 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  l==1 );..      /
14c50 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69  * Whether this i
14c60 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43  s an 'x IN(SELEC
14c70 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20  T...)' or an 'x 
14c80 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a  IN(<exprlist>)'.
14c90 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
14ca0 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65  ion it is handle
14cb0 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20  d the same way. 
14cc0 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   An ephemeral ta
14cd0 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  ble is .      **
14ce0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e 64   filled with ind
14cf0 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e  ex keys represen
14d00 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
14d10 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
14d20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74 68   ** SELECT or th
14d30 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
14d40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
14d50 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
14d60 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
14d70 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
14d80 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
14d90 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
14da0 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
14db0 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
14dc0 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
14dd0 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
14de0 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
14df0 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
14e00 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
14e10 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
14e20 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
14e30 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
14e40 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
14e50 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
14e60 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
14e70 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
14e80 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
14e90 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
14ea0 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
14eb0 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
14ec0 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
14ed0 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
14ee0 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
14ef0 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
14f00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
14f10 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
14f20 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14f30 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
14f40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14f50 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
14f60 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 45  l, .          pE
14f70 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73  xpr->iTable, (is
14f80 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a  Rowid?0:nVal));.
14f90 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
14fa0 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73   isRowid ? 0 : s
14fb0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
14fc0 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
14fd0 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  Val, 1);..      
14fe0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
14ff0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
15000 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
15010 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
15020 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
15030 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
15040 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
15050 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
15060 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
15070 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
15080 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
15090 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
150a0 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
150b0 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
150c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
150d0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
150e0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  t = pExpr->x.pSe
150f0 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 45 78  lect;.        Ex
15100 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
15110 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
15120 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
15130 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20  t( !isRowid );. 
15140 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
15150 20 4c 48 53 20 61 6e 64 20 52 48 53 20 6f 66 20   LHS and RHS of 
15160 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
15170 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68  do not match, th
15180 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72  at.        ** er
15190 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ror will have be
151a0 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62  en caught long b
151b0 65 66 6f 72 65 20 77 65 20 72 65 61 63 68 20 74  efore we reach t
151c0 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
151d0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
151e0 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  (pEList->nExpr==
151f0 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  nVal) ){.       
15200 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
15210 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  st;.          in
15220 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73  t i;.          s
15230 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
15240 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
15250 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Set, pExpr->iTab
15260 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  le);.          d
15270 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20 65  est.zAffSdst = e
15280 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50  xprINAffinity(pP
15290 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
152a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
152b0 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30  (pExpr->iTable&0
152c0 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70  x0000FFFF)==pExp
152d0 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
152e0 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e         pSelect->
152f0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
15300 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15310 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
15320 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
15330 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
15340 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d  tcase( pKeyInfo=
15350 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20  =0 ); /* Caused 
15360 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65  by OOM in sqlite
15370 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20  3KeyInfoAlloc() 
15380 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
15390 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
153a0 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
153b0 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
153c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
153d0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
153e0 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
153f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15400 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
15410 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pKeyInfo);.     
15420 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
15430 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15440 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
15450 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
15460 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b   dest.zAffSdst);
15470 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
15480 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
15490 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
154a0 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
154b0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
154c0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
154d0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
154e0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
154f0 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
15500 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >0 );.          
15510 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
15520 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
15530 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
15540 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
15550 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
15560 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
15570 20 2a 70 20 3d 20 28 6e 56 61 6c 3e 31 29 20 3f   *p = (nVal>1) ?
15580 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
15590 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
155a0 2c 20 69 29 20 3a 20 70 4c 65 66 74 3b 0a 20 20  , i) : pLeft;.  
155b0 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
155c0 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  fo->aColl[i] = s
155d0 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
155e0 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20  areCollSeq(.    
155f0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
15600 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61  se, p, pEList->a
15610 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20  [i].pExpr.      
15620 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
15630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15640 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
15650 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
15660 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
15670 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
15680 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
15690 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a  list).        **
156a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  .        ** For 
156b0 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c  each expression,
156c0 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20   build an index 
156d0 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61  key from the eva
156e0 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  luation and.    
156f0 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
15700 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
15710 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72   table. If <expr
15720 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  > is a column, t
15730 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20  hen use.        
15740 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
15750 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
15760 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
15770 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
15780 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
15790 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d   column, use num
157a0 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20  eric affinity.. 
157b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
157c0 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
157d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
157e0 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c  ffinity of the L
157f0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a  HS of the IN */.
15800 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
15810 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
15820 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
15830 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  x.pList;.       
15840 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
15850 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
15860 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
15870 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 61  , r3;..        a
15880 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
15890 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
158a0 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  eft);.        if
158b0 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  ( !affinity ){. 
158c0 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
158d0 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
158e0 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  LOB;.        }. 
158f0 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
15900 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
15910 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15920 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
15930 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a  le(pKeyInfo) );.
15940 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
15950 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  fo->aColl[0] = s
15960 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
15970 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
15980 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
15990 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c   }..        /* L
159a0 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
159b0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c   expression in <
159c0 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20  exprlist>. */.  
159d0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
159e0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
159f0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32  rse);.        r2
15a00 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
15a10 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
15a20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
15a30 64 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  d ) sqlite3VdbeA
15a40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
15a50 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  , 0, r2);.      
15a60 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
15a70 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
15a80 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
15a90 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
15aa0 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
15ab0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
15ac0 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
15ad0 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
15ae0 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
15af0 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
15b00 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
15b10 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
15b20 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
15b30 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
15b40 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
15b50 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
15b60 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
15b70 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
15b80 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
15b90 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
15ba0 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
15bb0 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
15bc0 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
15bd0 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
15be0 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
15bf0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
15c00 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
15c10 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
15c20 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
15c30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
15c40 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
15c50 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49  geToNoop(v, jmpI
15c60 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20  fDynamic);.     
15c70 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
15c80 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mic = -1;.      
15c90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
15ca0 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
15cb0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
15cc0 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
15cd0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
15ce0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
15cf0 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65  sRowid && sqlite
15d00 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
15d10 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20  E2, &iValToIns) 
15d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
15d30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15d40 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74  (v, OP_InsertInt
15d50 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
15d60 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b   r2, iValToIns);
15d70 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
15d80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33  {.            r3
15d90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15da0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
15db0 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
15dc0 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
15dd0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
15de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15df0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
15e00 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20  BeInt, r3,.     
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15e30 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
15e40 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
15e50 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
15e60 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
15e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15e80 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
15e90 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
15ea0 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20  ble, r2, r3);.  
15eb0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
15ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
15ed0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
15ee0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
15ef0 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
15f00 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
15f10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15f20 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
15f30 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
15f40 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r3, 1);.      
15f50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15f60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15f70 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72  IdxInsert, pExpr
15f80 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20  ->iTable, r2);. 
15f90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
15fa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15fb0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
15fc0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15fd0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
15fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15ff0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
16000 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
16010 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
16020 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nfo ){.        s
16030 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
16040 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P4(v, addr, (voi
16050 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  d *)pKeyInfo, P4
16060 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
16070 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
16080 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
16090 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
160a0 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
160b0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
160c0 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20      /* Case 3:  
160d0 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52    (SELECT ... FR
160e0 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a  OM ...).      **
160f0 20 20 20 20 20 6f 72 3a 20 20 20 20 45 58 49 53       or:    EXIS
16100 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  TS(SELECT ... FR
16110 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a  OM ...).      **
16120 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
16130 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65  SELECT, generate
16140 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
16150 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20   values for all 
16160 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20  columns of.     
16170 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 6f   ** the first ro
16180 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  w into an array 
16190 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  of registers and
161a0 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   return the inde
161b0 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  x of.      ** th
161c0 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
161d0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
161e0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
161f0 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65 20  n EXISTS, write 
16200 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f  an integer 0 (no
16210 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28  t exists) or 1 (
16220 65 78 69 73 74 73 29 0a 20 20 20 20 20 20 2a 2a  exists).      **
16230 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
16240 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
16250 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
16260 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
16270 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65   ** In both case
16280 73 2c 20 74 68 65 20 71 75 65 72 79 20 69 73 20  s, the query is 
16290 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 22  augmented with "
162a0 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79 20 0a  LIMIT 1".  Any .
162b0 20 20 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73        ** preexis
162c0 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 64 69  ting limit is di
162d0 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61 63 65  scarded in place
162e0 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49 4d 49   of the new LIMI
162f0 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  T 1..      */.  
16300 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
16310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
16330 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
16340 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   encode */.     
16350 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
16360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16370 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
16380 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43   deal with SELEC
16390 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  T result */.    
163a0 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
163d0 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
163e0 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63   */..      testc
163f0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
16400 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
16410 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
16420 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
16430 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
16440 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
16450 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72  _EXISTS || pExpr
16460 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
16470 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16480 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
16490 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
164a0 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20 20 20 20  lect) );..      
164b0 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e  pSel = pExpr->x.
164c0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 6e  pSelect;.      n
164d0 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d  Reg = pExpr->op=
164e0 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53 65  =TK_SELECT ? pSe
164f0 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l->pEList->nExpr
16500 20 3a 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   : 1;.      sqli
16510 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
16520 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50 61 72  t(&dest, 0, pPar
16530 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20  se->nMem+1);.   
16540 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
16550 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 69  += nReg;.      i
16560 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
16570 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
16580 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
16590 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20  SRT_Mem;.       
165a0 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65   dest.iSdst = de
165b0 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
165c0 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d      dest.nSdst =
165d0 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 20 20 73   nReg;.        s
165e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
165f0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
16600 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65  dest.iSDParm, de
16610 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d  st.iSDParm+nReg-
16620 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
16630 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
16640 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  t subquery resul
16650 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t"));.      }els
16660 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  e{.        dest.
16670 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73  eDest = SRT_Exis
16680 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
16690 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
166a0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
166b0 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
166c0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
166d0 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49  nt((v, "Init EXI
166e0 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  STS result"));. 
166f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
16700 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
16710 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d  Parse->db, pSel-
16720 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
16730 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pSel->pLimit = s
16740 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
16750 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  se, TK_INTEGER, 
16760 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
16770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16780 20 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33          &sqlite3
16790 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20  IntTokens[1]);. 
167a0 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69       pSel->iLimi
167b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  t = 0;.      pSe
167c0 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  l->selFlags &= ~
167d0 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20  SF_MultiValue;. 
167e0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
167f0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
16800 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  Sel, &dest) ){. 
16810 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
16820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
16830 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Reg = dest.iSDPa
16840 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65  rm;.      ExprSe
16850 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
16860 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
16870 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16880 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
16890 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a  rHasNullFlag ){.
168a0 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61      sqlite3SetHa
168b0 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78  sNullFlag(v, pEx
168c0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73  pr->iTable, rHas
168d0 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a  NullFlag);.  }..
168e0 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d    if( jmpIfDynam
168f0 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ic>=0 ){.    sql
16900 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
16910 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  (v, jmpIfDynamic
16920 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
16930 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
16940 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  rse);..  return 
16950 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rReg;.}.#endif /
16960 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
16970 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
16980 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16990 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78  UBQUERY./*.** Ex
169a0 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49 4e 28  pr pIn is an IN(
169b0 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e  ...) expression.
169c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
169d0 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 0a  hecks that the .
169e0 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 6e  ** sub-select on
169f0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
16a00 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20 68 61  IN() operator ha
16a10 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  s the same numbe
16a20 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  r of .** columns
16a30 20 61 73 20 74 68 65 20 76 65 63 74 6f 72 20 6f   as the vector o
16a40 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20 69  n the LHS. Or, i
16a50 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
16a60 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a 2a   IN() is not .**
16a70 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20 74 68   a sub-query, th
16a80 61 74 20 74 68 65 20 4c 48 53 20 69 73 20 61 20  at the LHS is a 
16a90 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65 20 31  vector of size 1
16aa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16ab0 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61 72 73  ExprCheckIN(Pars
16ac0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
16ad0 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56 65  *pIn){.  int nVe
16ae0 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78  ctor = sqlite3Ex
16af0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 49 6e  prVectorSize(pIn
16b00 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
16b10 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45 50  (pIn->flags & EP
16b20 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
16b30 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d     if( nVector!=
16b40 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  pIn->x.pSelect->
16b50 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
16b60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75  .      sqlite3Su
16b70 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  bselectError(pPa
16b80 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c  rse, pIn->x.pSel
16b90 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
16ba0 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20  pr, nVector);.  
16bb0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
16bc0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
16bd0 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20  nVector!=1 ){.  
16be0 20 20 69 66 28 20 28 70 49 6e 2d 3e 70 4c 65 66    if( (pIn->pLef
16bf0 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  t->flags & EP_xI
16c00 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
16c10 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
16c20 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
16c30 6e 56 65 63 74 6f 72 2c 20 31 29 3b 0a 20 20 20  nVector, 1);.   
16c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
16c50 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
16c60 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65  arse, "row value
16c70 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20   misused");.    
16c80 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  }.    return 1;.
16c90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
16ca0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
16cb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
16cc0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
16cd0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
16ce0 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n IN expression.
16cf0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
16d00 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
16d10 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75        x IN (valu
16d20 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a  e, value, ...).*
16d30 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61  *.** The left-ha
16d40 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73  nd side (LHS) is
16d50 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63   a scalar or vec
16d60 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  tor expression. 
16d70 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   The .** right-h
16d80 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 69  and side (RHS) i
16d90 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65  s an array of ze
16da0 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61  ro or more scala
16db0 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a  r values, or a.*
16dc0 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49 66 20  * subquery.  If 
16dd0 74 68 65 20 52 48 53 20 69 73 20 61 20 73 75 62  the RHS is a sub
16de0 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65  query, the numbe
16df0 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
16e00 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63  mns must.** matc
16e10 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
16e20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76  columns in the v
16e30 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ector on the LHS
16e40 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
16e50 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61  .** a list of va
16e60 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75  lues, the LHS mu
16e70 73 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20  st be a scalar. 
16e80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70  .**.** The IN op
16e90 65 72 61 74 6f 72 20 69 73 20 74 72 75 65 20 69  erator is true i
16ea0 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20  f the LHS value 
16eb0 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  is contained wit
16ec0 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20  hin the RHS..** 
16ed0 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61  The result is fa
16ee0 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
16ef0 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74  s definitely not
16f00 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68   in the RHS.  Th
16f10 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  e .** result is 
16f20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73  NULL if the pres
16f30 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20  ence of the LHS 
16f40 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f  in the RHS canno
16f50 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69  t be .** determi
16f60 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  ned due to NULLs
16f70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16f80 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
16f90 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74  ode that jumps t
16fa0 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66  o destIfFalse if
16fb0 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
16fc0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
16fd0 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49  thin the RHS.  I
16fe0 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77  f due to NULLs w
16ff0 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
17000 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a  ne if the LHS.**
17010 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
17020 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75   the RHS then ju
17030 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c  mp to destIfNull
17040 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  .  If the LHS is
17050 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69   contained.** wi
17060 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  thin the RHS the
17070 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a  n fall through..
17080 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65  **.** See the se
17090 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74  parate in-operat
170a0 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74  or.md documentat
170b0 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ion file in the 
170c0 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c  canonical.** SQL
170d0 69 74 65 20 73 6f 75 72 63 65 20 74 72 65 65 20  ite source tree 
170e0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
170f0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
17100 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
17110 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
17120 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
17130 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
17140 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
17150 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
17160 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
17170 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
17180 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
17190 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
171a0 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
171b0 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
171c0 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
171d0 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
171e0 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
171f0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
17200 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
17210 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
17220 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
17230 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
17240 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
17250 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
17260 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
17270 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
17280 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
17290 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
172a0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
172b0 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20  t rLhs;         
172c0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28      /* Register(
172d0 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c  s) holding the L
172e0 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  HS values */.  i
172f0 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20  nt rLhsOrig;    
17300 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75       /* LHS valu
17310 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72  es prior to reor
17320 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b  dering by aiMap[
17330 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ] */.  Vdbe *v; 
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17350 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
17360 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
17370 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30    int *aiMap = 0
17380 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66  ;       /* Map f
17390 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64  rom vector field
173a0 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   to index column
173b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
173c0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41   = 0;       /* A
173d0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66  ffinity string f
173e0 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a  or comparisons *
173f0 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b  /.  int nVector;
17400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
17410 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72  e of vectors for
17420 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
17430 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d  r */.  int iDumm
17440 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
17450 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20  Dummy parameter 
17460 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  to exprCodeVecto
17470 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  r() */.  Expr *p
17480 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Left;          /
17490 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * The LHS of the
174a0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
174b0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
174c0 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20          /* loop 
174d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
174e0 20 64 65 73 74 53 74 65 70 32 3b 20 20 20 20 20   destStep2;     
174f0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
17500 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73  ump when NULLs s
17510 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f  een in step 2 */
17520 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 36  .  int destStep6
17530 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72   = 0;    /* Star
17540 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74  t of code for St
17550 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ep 6 */.  int ad
17560 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20  drTruthOp;      
17570 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70  /* Address of op
17580 63 6f 64 65 20 74 68 61 74 20 64 65 74 65 72 6d  code that determ
17590 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20 74  ines the IN is t
175a0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  rue */.  int des
175b0 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f  tNotNull;      /
175c0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61  * Jump here if a
175d0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
175e0 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65 70 20  ot true in step 
175f0 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  6 */.  int addrT
17600 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
17610 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d  Top of the step-
17620 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c  6 loop */ ..  pL
17630 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
17640 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ft;.  if( sqlite
17650 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61  3ExprCheckIN(pPa
17660 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65  rse, pExpr) ) re
17670 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65  turn;.  zAff = e
17680 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50  xprINAffinity(pP
17690 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
176a0 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
176b0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
176c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
176d0 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73   aiMap = (int*)s
176e0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
176f0 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  ro(.      pParse
17700 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73  ->db, nVector*(s
17710 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a  izeof(int) + siz
17720 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20  eof(char)) + 1. 
17730 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
17740 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
17750 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65  ed ) goto sqlite
17760 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f  3ExprCodeIN_oom_
17770 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74  error;..  /* Att
17780 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20  empt to compute 
17790 74 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74  the RHS. After t
177a0 68 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79  his step, if any
177b0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
177c0 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e  .  ** IN_INDEX_N
177d0 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c  OOP is returned,
177e0 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65   the table opene
177f0 64 20 69 74 68 20 63 75 72 73 6f 72 20 70 45 78  d ith cursor pEx
17800 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a  pr->iTable .  **
17810 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
17820 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
17830 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e  p the RHS. If IN
17840 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
17850 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68  eturned,.  ** th
17860 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65  e RHS has not ye
17870 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a  t been coded.  *
17880 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
17890 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
178a0 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
178b0 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
178c0 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
178d0 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
178e0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
178f0 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
17900 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
17910 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
17920 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20  arse, pExpr,.   
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44            IN_IND
17950 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20  EX_MEMBERSHIP | 
17960 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
17970 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
17990 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
179a0 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52  IfNull ? 0 : &rR
179b0 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70  hsHasNull, aiMap
179c0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
179d0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56  arse->nErr || nV
179e0 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70  ector==1 || eTyp
179f0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a  e==IN_INDEX_EPH.
17a00 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
17a10 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
17a20 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e  ASC || eType==IN
17a30 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
17a40 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53  C .  );.#ifdef S
17a50 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
17a60 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69   Confirm that ai
17a70 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  Map[] contains n
17a80 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76  Vector integer v
17a90 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30 20  alues between 0 
17aa0 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72  and.  ** nVector
17ab0 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  -1. */.  for(i=0
17ac0 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
17ad0 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e  ){.    int j, cn
17ae0 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a  t;.    for(cnt=j
17af0 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a  =0; j<nVector; j
17b00 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d  ++) if( aiMap[j]
17b10 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20  ==i ) cnt++;.   
17b20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20   assert( cnt==1 
17b30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
17b40 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53   /* Code the LHS
17b50 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  , the <expr> fro
17b60 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
17b70 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20  .)". If the LHS 
17b80 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f  is a .  ** vecto
17b90 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73 74  r, then it is st
17ba0 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79  ored in an array
17bb0 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69   of nVector regi
17bc0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a  sters starting .
17bd0 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a    ** at r1..  **
17be0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  .  ** sqlite3Fin
17bf0 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74  dInIndex() might
17c00 20 68 61 76 65 20 72 65 6f 72 64 65 72 65 64 20   have reordered 
17c10 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  the fields of th
17c20 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a  e LHS vector.  *
17c30 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 69  * so that the fi
17c40 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  elds are in the 
17c50 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e  same order as an
17c60 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e   existing index.
17c70 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61     The.  ** aiMa
17c80 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  p[] array contai
17c90 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f  ns a mapping fro
17ca0 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c  m the original L
17cb0 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74  HS field order t
17cc0 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64  o.  ** the field
17cd0 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61 74 63   order that matc
17ce0 68 65 73 20 74 68 65 20 52 48 53 20 69 6e 64 65  hes the RHS inde
17cf0 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
17d00 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
17d10 50 61 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72  Parse);.  rLhsOr
17d20 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63  ig = exprCodeVec
17d30 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  tor(pParse, pLef
17d40 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66  t, &iDummy);.  f
17d50 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
17d60 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69  r && aiMap[i]==i
17d70 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20  ; i++){} /* Are 
17d80 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64  LHS fields reord
17d90 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69  ered? */.  if( i
17da0 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20  ==nVector ){.   
17db0 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61   /* LHS fields a
17dc0 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64  re not reordered
17dd0 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72   */.    rLhs = r
17de0 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65  LhsOrig;.  }else
17df0 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
17e00 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53   reorder the LHS
17e10 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e   fields accordin
17e20 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20  g to aiMap */.  
17e30 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33    rLhs = sqlite3
17e40 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
17e50 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  rse, nVector);. 
17e60 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
17e70 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
17e80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17e90 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
17ea0 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68   rLhsOrig+i, rLh
17eb0 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a  s+aiMap[i], 0);.
17ec0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
17ed0 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  If sqlite3FindIn
17ee0 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20  Index() did not 
17ef0 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
17f00 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  n index that is.
17f10 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f    ** suitable fo
17f20 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65  r evaluating the
17f30 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68   IN operator, th
17f40 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e  en evaluate usin
17f50 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  g a.  ** sequenc
17f60 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73  e of comparisons
17f70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
17f80 20 69 73 20 73 74 65 70 20 28 31 29 20 69 6e 20   is step (1) in 
17f90 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e  the in-operator.
17fa0 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67  md optimized alg
17fb0 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69  orithm..  */.  i
17fc0 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
17fd0 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45  EX_NOOP ){.    E
17fe0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
17ff0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
18000 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
18010 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
18020 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
18030 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
18040 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20      int labelOk 
18050 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18060 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
18070 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65  nt r2, regToFree
18080 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e  ;.    int regCkN
18090 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ull = 0;.    int
180a0 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28   ii;.    assert(
180b0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
180c0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
180d0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
180e0 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  ( destIfNull!=de
180f0 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
18100 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73     regCkNull = s
18110 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
18120 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18130 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18140 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
18150 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43  rLhs, rLhs, regC
18160 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  kNull);.    }.  
18170 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
18180 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  List->nExpr; ii+
18190 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  +){.      r2 = s
181a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
181b0 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  mp(pParse, pList
181c0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26  ->a[ii].pExpr, &
181d0 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  regToFree);.    
181e0 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
181f0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
18200 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61  nBeNull(pList->a
18210 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
18220 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18230 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
18240 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c  itAnd, regCkNull
18250 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  , r2, regCkNull)
18260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18270 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  if( ii<pList->nE
18280 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e  xpr-1 || destIfN
18290 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
182a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
182b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
182c0 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61   OP_Eq, rLhs, la
182d0 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20  belOk, r2,.     
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182f0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
18300 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
18310 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
18320 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69  rageIf(v, ii<pLi
18330 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
18340 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
18350 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73  geIf(v, ii==pLis
18360 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
18370 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18380 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
18390 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
183a0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
183b0 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  t( destIfNull==d
183c0 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20  estIfFalse );.  
183d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
183e0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
183f0 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61  , rLhs, destIfFa
18400 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lse, r2,.       
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18420 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
18430 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64   P4_COLLSEQ); Vd
18440 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18450 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18460 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
18470 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a  ff[0] | SQLITE_J
18480 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
18490 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
184a0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
184b0 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65  pParse, regToFre
184c0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
184d0 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20  ( regCkNull ){. 
184e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
184f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
18500 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  ull, regCkNull, 
18510 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
18520 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
18540 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
18550 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se);.    }.    s
18560 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
18570 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f  eLabel(v, labelO
18580 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  k);.    sqlite3R
18590 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
185a0 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  arse, regCkNull)
185b0 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74  ;.    goto sqlit
185c0 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
185d0 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ished;.  }..  /*
185e0 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74   Step 2: Check t
185f0 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53  o see if the LHS
18600 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
18610 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20  LL columns.  If 
18620 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65  the.  ** LHS doe
18630 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20  s contain NULLs 
18640 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
18650 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46  must be either F
18660 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20  ALSE or NULL..  
18670 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20  ** We will then 
18680 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20  skip the binary 
18690 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48  search of the RH
186a0 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
186b0 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
186c0 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73  False ){.    des
186d0 74 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46  tStep2 = destIfF
186e0 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  alse;.  }else{. 
186f0 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
18700 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74  estStep6 = sqlit
18710 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18720 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  v);.  }.  for(i=
18730 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
18740 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
18750 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
18760 69 65 6c 64 53 75 62 65 78 70 72 28 70 45 78 70  ieldSubexpr(pExp
18770 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  r->pLeft, i);.  
18780 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
18790 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b  rCanBeNull(p) ){
187a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
187b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
187c0 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64  sNull, rLhs+i, d
187d0 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20  estStep2);.     
187e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
187f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
18800 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c  * Step 3.  The L
18810 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20  HS is now known 
18820 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  to be non-NULL. 
18830 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73   Do the binary s
18840 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68  earch.  ** of th
18850 65 20 52 48 53 20 75 73 69 6e 67 20 74 68 65 20  e RHS using the 
18860 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20  LHS as a probe. 
18870 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72   If found, the r
18880 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72  esult is.  ** tr
18890 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ue..  */.  if( e
188a0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
188b0 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OWID ){.    /* I
188c0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
188d0 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49   RHS is the ROWI
188e0 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65  D of table b-tre
188f0 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f  e and so we also
18900 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61  .    ** know tha
18910 74 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e  t the RHS is non
18920 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77  -NULL.  Hence, w
18930 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20  e combine steps 
18940 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69  3 and 4.    ** i
18950 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  nto a single opc
18960 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ode. */.    sqli
18970 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
18980 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70   OP_SeekRowid, p
18990 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
189a0 73 74 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29  stIfFalse, rLhs)
189b0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
189c0 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54  ge(v);.    addrT
189d0 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33  ruthOp = sqlite3
189e0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
189f0 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75  _Goto);  /* Retu
18a00 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c  rn True */.  }el
18a10 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
18a20 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
18a30 41 66 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20  Affinity, rLhs, 
18a40 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66  nVector, 0, zAff
18a50 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
18a60 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d  if( destIfFalse=
18a70 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20  =destIfNull ){. 
18a80 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20       /* Combine 
18a90 53 74 65 70 20 33 20 61 6e 64 20 53 74 65 70 20  Step 3 and Step 
18aa0 35 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  5 into a single 
18ab0 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  opcode */.      
18ac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18ad0 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
18ae0 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
18af0 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
18b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18b10 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73              rLhs
18b20 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65  , nVector); Vdbe
18b30 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
18b40 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45     goto sqlite3E
18b50 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
18b60 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
18b70 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20 33   Ordinary Step 3
18b80 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  , for the case w
18b90 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e  here FALSE and N
18ba0 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74  ULL are distinct
18bb0 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74   */.    addrTrut
18bc0 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  hOp = sqlite3Vdb
18bd0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
18be0 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
18bf0 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20  Table, 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 20 20 20 20 20 20                  
18c20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20  rLhs, nVector); 
18c30 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18c40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
18c50 34 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69  4.  If the RHS i
18c60 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f  s known to be no
18c70 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69  n-NULL and we di
18c80 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20  d not find.  ** 
18c90 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20  an match on the 
18ca0 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68  search above, th
18cb0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
18cc0 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a  st be FALSE..  *
18cd0 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61 73 4e  /.  if( rRhsHasN
18ce0 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d  ull && nVector==
18cf0 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
18d00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18d10 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61  _NotNull, rRhsHa
18d20 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c  sNull, destIfFal
18d30 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  se);.    VdbeCov
18d40 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
18d50 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20   /* Step 5.  If 
18d60 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
18d70 62 6f 75 74 20 74 68 65 20 64 69 66 66 65 72 65  bout the differe
18d80 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c  nce between NULL
18d90 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c   and.  ** FALSE,
18da0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
18db0 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20  n false. .  */. 
18dc0 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65   if( destIfFalse
18dd0 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73  ==destIfNull ) s
18de0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
18df0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
18e00 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f  .  /* Step 6: Lo
18e10 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20  op through rows 
18e20 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d  of the RHS.  Com
18e30 70 61 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f  pare each row to
18e40 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49   the LHS..  ** I
18e50 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e  f any comparison
18e60 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
18e70 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
18e80 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20  L.  If all.  ** 
18e90 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20  comparisons are 
18ea0 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66  FALSE then the f
18eb0 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46  inal result is F
18ec0 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ALSE..  **.  ** 
18ed0 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53  For a scalar LHS
18ee0 2c 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  , it is sufficie
18ef0 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74  nt to check just
18f00 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20   the first row. 
18f10 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a   ** of the RHS..
18f20 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53    */.  if( destS
18f30 74 65 70 36 20 29 20 73 71 6c 69 74 65 33 56 64  tep6 ) sqlite3Vd
18f40 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
18f50 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20  , destStep6);.  
18f60 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
18f70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18f80 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d  P_Rewind, pExpr-
18f90 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
18fa0 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76  alse);.  VdbeCov
18fb0 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
18fc0 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
18fd0 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73   destNotNull = s
18fe0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18ff0 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  bel(v);.  }else{
19000 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63  .    /* For nVec
19010 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20  tor==1, combine 
19020 73 74 65 70 73 20 36 20 61 6e 64 20 37 20 62 79  steps 6 and 7 by
19030 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
19040 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41  urning.    ** FA
19050 4c 53 45 20 69 66 20 74 68 65 20 66 69 72 73 74  LSE if the first
19060 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
19070 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64  ot NULL */.    d
19080 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73  estNotNull = des
19090 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20  tIfFalse;.  }.  
190a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
190b0 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  or; i++){.    Ex
190c0 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53  pr *p;.    CollS
190d0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69  eq *pColl;.    i
190e0 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47  nt r3 = sqlite3G
190f0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19100 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
19110 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
19120 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
19130 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
19140 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
19150 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73  Parse, p);.    s
19160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19170 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
19180 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c  Expr->iTable, i,
19190 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   r3);.    sqlite
191a0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
191b0 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65  P_Ne, rLhs+i, de
191c0 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20  stNotNull, r3,. 
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191e0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
191f0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
19200 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
19210 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
19220 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
19230 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a  Parse, r3);.  }.
19240 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19250 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
19260 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  0, destIfNull);.
19270 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
19280 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
19290 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
192a0 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a  , destNotNull);.
192b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
192c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
192d0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
192e0 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20   addrTop+1);.   
192f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19300 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37  ;..    /* Step 7
19310 3a 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74  :  If we reach t
19320 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
19330 6f 77 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ow that the resu
19340 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  lt must.    ** b
19350 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20  e false. */.    
19360 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19370 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
19380 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
19390 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68   }..  /* Jumps h
193a0 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ere in order to 
193b0 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a  return true. */.
193c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
193d0 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 72 75  pHere(v, addrTru
193e0 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45  thOp);..sqlite3E
193f0 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
19400 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d  ed:.  if( rLhs!=
19410 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74  rLhsOrig ) sqlit
19420 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19430 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a  (pParse, rLhs);.
19440 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19450 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
19460 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
19470 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29   "end IN expr"))
19480 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ;.sqlite3ExprCod
19490 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20  eIN_oom_error:. 
194a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
194b0 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70  Parse->db, aiMap
194c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
194d0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
194e0 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Aff);.}.#endif /
194f0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
19500 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
19510 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
19520 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
19530 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
19540 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
19550 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
19560 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
19570 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
19580 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
19590 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
195a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
195b0 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
195c0 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
195d0 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
195e0 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
195f0 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
19600 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
19610 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
19620 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
19630 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
19640 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
19650 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19660 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
19670 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
19680 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
19690 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
196a0 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
196b0 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
196c0 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  ue;.    sqlite3A
196d0 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
196e0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
196f0 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
19700 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
19710 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
19720 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
19730 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
19740 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
19750 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
19760 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
19770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19780 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52  dOp4Dup8(v, OP_R
19790 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
197a0 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
197b0 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _REAL);.  }.}.#e
197c0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ndif.../*.** Gen
197d0 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
197e0 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
197f0 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
19800 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
19810 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  xt z[0..n-1] int
19820 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
19830 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54  .**.** Expr.u.zT
19840 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55  oken is always U
19850 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72  TF8 and zero-ter
19860 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  minated..*/.stat
19870 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
19880 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
19890 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
198a0 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
198b0 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a   iMem){.  Vdbe *
198c0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
198d0 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  e;.  if( pExpr->
198e0 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
198f0 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
19900 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
19910 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
19920 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
19930 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
19940 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19950 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
19960 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
19970 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
19980 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c  t c;.    i64 val
19990 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ue;.    const ch
199a0 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ar *z = pExpr->u
199b0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73  .zToken;.    ass
199c0 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20  ert( z!=0 );.   
199d0 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f   c = sqlite3DecO
199e0 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61  rHexToI64(z, &va
199f0 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  lue);.    if( c=
19a00 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e  =0 || (c==2 && n
19a10 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20  egFlag) ){.     
19a20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20   if( negFlag ){ 
19a30 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53  value = c==2 ? S
19a40 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20  MALLEST_INT64 : 
19a50 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20  -value; }.      
19a60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19a70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36  4Dup8(v, OP_Int6
19a80 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  4, 0, iMem, 0, (
19a90 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49  u8*)&value, P4_I
19aa0 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NT64);.    }else
19ab0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
19ac0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
19ad0 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65  INT.      sqlite
19ae0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19af0 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74  , "oversized int
19b00 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67  eger: %s%s", neg
19b10 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c  Flag ? "-" : "",
19b20 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64   z);.#else.#ifnd
19b30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48  ef SQLITE_OMIT_H
19b40 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20  EX_INTEGER.     
19b50 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
19b60 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d  nicmp(z,"0x",2)=
19b70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
19b80 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
19b90 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72  arse, "hex liter
19ba0 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 22 2c  al too big: %s",
19bb0 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   z);.      }else
19bc0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
19bd0 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
19be0 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20  (v, z, negFlag, 
19bf0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  iMem);.      }.#
19c00 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
19c10 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
19c20 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
19c30 2a 2a 20 56 65 72 69 66 79 20 74 68 65 20 63 6f  ** Verify the co
19c40 6e 73 69 73 74 65 6e 63 79 20 6f 66 20 74 68 65  nsistency of the
19c50 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 0a 2a 2f   column cache.*/
19c60 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 68  .static int cach
19c70 65 49 73 56 61 6c 69 64 28 50 61 72 73 65 20 2a  eIsValid(Parse *
19c80 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
19c90 2c 20 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30  , n;.  for(i=n=0
19ca0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
19cb0 43 41 43 48 45 3b 20 69 2b 2b 29 7b 0a 20 20 20  CACHE; i++){.   
19cc0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f   if( pParse->aCo
19cd0 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3e 30  lCache[i].iReg>0
19ce0 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ) n++;.  }.  re
19cf0 74 75 72 6e 20 6e 3d 3d 70 50 61 72 73 65 2d 3e  turn n==pParse->
19d00 6e 43 6f 6c 43 61 63 68 65 3b 0a 7d 0a 23 65 6e  nColCache;.}.#en
19d10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  dif../*.** Clear
19d20 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a   a cache entry..
19d30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
19d40 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50  acheEntryClear(P
19d50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
19d60 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
19d70 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d  p){.  if( p->tem
19d80 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20  pReg ){.    if( 
19d90 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
19da0 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
19db0 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
19dc0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54        pParse->aT
19dd0 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
19de0 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e  TempReg++] = p->
19df0 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iReg;.    }.    
19e00 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
19e10 20 20 7d 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20    }.  p->iReg = 
19e20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f  0;.  pParse->nCo
19e30 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 61 73 73 65  lCache--;.  asse
19e40 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
19e50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
19e60 63 61 63 68 65 49 73 56 61 6c 69 64 28 70 50 61  cacheIsValid(pPa
19e70 72 73 65 29 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  rse) );.}.../*.*
19e80 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * Record in the 
19e90 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61  column cache tha
19ea0 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63  t a particular c
19eb0 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20  olumn from a.** 
19ec0 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
19ed0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20   is stored in a 
19ee0 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73  particular regis
19ef0 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ter..*/.void sql
19f00 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
19f10 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  re(Parse *pParse
19f20 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20  , int iTab, int 
19f30 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b  iCol, int iReg){
19f40 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
19f50 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64  minLru;.  int id
19f60 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79  xLru;.  struct y
19f70 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
19f80 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72 72  /* Unless an err
19f90 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
19fa0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
19fb0 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73  s are always pos
19fc0 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65  itive. */.  asse
19fd0 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70 50  rt( iReg>0 || pP
19fe0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
19ff0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1a000 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65  Failed );.  asse
1a010 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20  rt( iCol>=-1 && 
1a020 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f  iCol<32768 );  /
1a030 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20  * Finite column 
1a040 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a  numbers */..  /*
1a050 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75   The SQLITE_Colu
1a060 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73  mnCache flag dis
1a070 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ables the column
1a080 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73   cache.  This is
1a090 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74   used.  ** for t
1a0a0 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f  esting only - to
1a0b0 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c   verify that SQL
1a0c0 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20  ite always gets 
1a0d0 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
1a0e0 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69    ** with and wi
1a0f0 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e  thout the column
1a100 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69   cache..  */.  i
1a110 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
1a120 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  isabled(pParse->
1a130 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d  db, SQLITE_Colum
1a140 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e  nCache) ) return
1a150 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65  ;..  /* First re
1a160 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69  place any existi
1a170 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20  ng entry..  **. 
1a180 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
1a190 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e  e way the column
1a1a0 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e   cache is curren
1a1b0 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65  tly used, we are
1a1c0 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a   guaranteed.  **
1a1d0 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74   that the object
1a1e0 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65   will never alre
1a1f0 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e  ady be in cache.
1a200 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75    Verify this gu
1a210 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69  arantee..  */.#i
1a220 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66  fndef NDEBUG.  f
1a230 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1a240 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
1a250 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1a260 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1a270 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67   assert( p->iReg
1a280 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65  ==0 || p->iTable
1a290 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f  !=iTab || p->iCo
1a2a0 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20  lumn!=iCol );.  
1a2b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46  }.#endif..  /* F
1a2c0 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f  ind an empty slo
1a2d0 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74  t and replace it
1a2e0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
1a2f0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1a300 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
1a310 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
1a320 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
1a330 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Reg==0 ){.      
1a340 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72  p->iLevel = pPar
1a350 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
1a360 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65  .      p->iTable
1a370 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70   = iTab;.      p
1a380 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
1a390 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
1a3a0 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d  = iReg;.      p-
1a3b0 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
1a3c0 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
1a3d0 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
1a3e0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1a3f0 6e 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20  nColCache++;.   
1a400 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1a410 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1a420 6c 65 64 20 7c 7c 20 63 61 63 68 65 49 73 56 61  led || cacheIsVa
1a430 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b 0a 20  lid(pParse) );. 
1a440 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1a450 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
1a460 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72 65  lace the last re
1a470 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20  cently used */. 
1a480 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66   minLru = 0x7fff
1a490 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d  ffff;.  idxLru =
1a4a0 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   -1;.  for(i=0, 
1a4b0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1a4c0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
1a4d0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
1a4e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
1a4f0 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20  lru<minLru ){.  
1a500 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a      idxLru = i;.
1a510 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70        minLru = p
1a520 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->lru;.    }.  }
1a530 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69 64  .  if( ALWAYS(id
1a540 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20  xLru>=0) ){.    
1a550 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
1a560 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a  lCache[idxLru];.
1a570 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20      p->iLevel = 
1a580 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1a590 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  vel;.    p->iTab
1a5a0 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  le = iTab;.    p
1a5b0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
1a5c0 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20  ;.    p->iReg = 
1a5d0 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d  iReg;.    p->tem
1a5e0 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pReg = 0;.    p-
1a5f0 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
1a600 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
1a610 61 73 73 65 72 74 28 20 63 61 63 68 65 49 73 56  assert( cacheIsV
1a620 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b 0a  alid(pParse) );.
1a630 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1a640 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
1a650 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73  e that registers
1a660 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69   between iReg..i
1a670 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62  Reg+nReg-1 are b
1a680 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
1a690 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72  ..** Purge the r
1a6a0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
1a6b0 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  s from the colum
1a6c0 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64  n cache..*/.void
1a6d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1a6e0 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70  eRemove(Parse *p
1a6f0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
1a700 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 74   int nReg){.  st
1a710 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1a720 70 3b 0a 20 20 69 66 28 20 69 52 65 67 3c 3d 30  p;.  if( iReg<=0
1a730 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c   || pParse->nCol
1a740 43 61 63 68 65 3d 3d 30 20 29 20 72 65 74 75 72  Cache==0 ) retur
1a750 6e 3b 0a 20 20 70 20 3d 20 26 70 50 61 72 73 65  n;.  p = &pParse
1a760 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 53 51 4c 49  ->aColCache[SQLI
1a770 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 2d 31 5d  TE_N_COLCACHE-1]
1a780 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20  ;.  while(1){.  
1a790 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 3e 3d    if( p->iReg >=
1a7a0 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52 65 67   iReg && p->iReg
1a7b0 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29 20 63   < iReg+nReg ) c
1a7c0 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
1a7d0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
1a7e0 66 28 20 70 3d 3d 70 50 61 72 73 65 2d 3e 61 43  f( p==pParse->aC
1a7f0 6f 6c 43 61 63 68 65 20 29 20 62 72 65 61 6b 3b  olCache ) break;
1a800 0a 20 20 20 20 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a  .    p--;.  }.}.
1a810 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
1a820 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
1a830 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74  mn cache context
1a840 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69  .  Any new entri
1a850 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65  es added.** adde
1a860 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d to the column 
1a870 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
1a880 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65   call are remove
1a890 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  d when the.** co
1a8a0 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20  rresponding pop 
1a8b0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
1a8c0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1a8d0 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
1a8e0 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69  se){.  pParse->i
1a8f0 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69  CacheLevel++;.#i
1a900 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1a910 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
1a920 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1a930 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1a940 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
1a950 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20  "PUSH to %d\n", 
1a960 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1a970 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
1a980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
1a990 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e   from the column
1a9a0 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69   cache any entri
1a9b0 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64  es that were add
1a9c0 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  ed since the.** 
1a9d0 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 71 6c  the previous sql
1a9e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1a9f0 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e  h operation.  In
1aa00 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
1aa10 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61 63  store.** the cac
1aa20 68 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  he to the state 
1aa30 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72 20  it was in prior 
1aa40 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
1aa50 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  Push..*/.void sq
1aa60 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1aa70 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  p(Parse *pParse)
1aa80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1aa90 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
1aaa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1aab0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e  se->iCacheLevel>
1aac0 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =1 );.  pParse->
1aad0 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23  iCacheLevel--;.#
1aae0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1aaf0 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
1ab00 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1ab10 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1ab20 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1ab30 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c  ("POP  to %d\n",
1ab40 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1ab50 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
1ab60 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  f.  for(i=0, p=p
1ab70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1ab80 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
1ab90 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
1aba0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
1abb0 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70  g && p->iLevel>p
1abc0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1abd0 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  el ){.      cach
1abe0 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
1abf0 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  se, p);.    }.  
1ac00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  }.}../*.** When 
1ac10 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20  a cached column 
1ac20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20  is reused, make 
1ac30 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65  sure that its re
1ac40 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20  gister is.** no 
1ac50 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65  longer available
1ac60 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73   as a temp regis
1ac70 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38  ter.  ticket #38
1ac80 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a  79:  that same.*
1ac90 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74  * register might
1aca0 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
1acb0 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
1acc0 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20  ces, so be sure 
1acd0 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61  to.** get them a
1ace0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
1acf0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1ad00 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50  chePinRegister(P
1ad10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1ad20 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
1ad30 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
1ad40 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
1ad50 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1ad60 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
1ad70 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
1ad80 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
1ad90 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
1ada0 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  {.      p->tempR
1adb0 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
1adc0 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  }.}../* Generate
1add0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1ade0 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73 74  load into regist
1adf0 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c 75  er regOut a valu
1ae00 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70  e that is.** app
1ae10 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
1ae20 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75   iIdxCol-th colu
1ae30 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  mn of index pIdx
1ae40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ae50 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64  3ExprCodeLoadInd
1ae60 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  exColumn(.  Pars
1ae70 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20 54  e *pParse,  /* T
1ae80 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1ae90 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
1aea0 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20 69  Idx,    /* The i
1aeb0 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d  ndex whose colum
1aec0 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64 65  n is to be loade
1aed0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  d */.  int iTabC
1aee0 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ur,    /* Cursor
1aef0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74   pointing to a t
1af00 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  able row */.  in
1af10 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a  t iIdxCol,    /*
1af20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   The column of t
1af30 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 6c  he index to be l
1af40 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  oaded */.  int r
1af50 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53 74  egOut      /* St
1af60 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f  ore the index co
1af70 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68  lumn value in th
1af80 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
1af90 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c 20  {.  i16 iTabCol 
1afa0 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
1afb0 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28  [iIdxCol];.  if(
1afc0 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50   iTabCol==XN_EXP
1afd0 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
1afe0 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
1aff0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b000 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e  Idx->aColExpr->n
1b010 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a  Expr>iIdxCol );.
1b020 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
1b030 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 3b 0a  fTab = iTabCur;.
1b040 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1b050 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20  odeCopy(pParse, 
1b060 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1b070 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72  a[iIdxCol].pExpr
1b080 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
1b090 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1b0a0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1b0b0 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  OfTable(pParse->
1b0c0 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61  pVdbe, pIdx->pTa
1b0d0 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20  ble, iTabCur,.  
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 20 20 20 20                  
1b100 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75    iTabCol, regOu
1b110 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1b120 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b130 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61  o extract the va
1b140 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d  lue of the iCol-
1b150 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  th column of a t
1b160 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
1b170 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1b180 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20  ColumnOfTable(. 
1b190 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
1b1a0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64   /* The VDBE und
1b1b0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1b1c0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1b1d0 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
1b1e0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1b1f0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
1b200 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54  iTabCur,    /* T
1b210 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e  he table cursor.
1b220 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73    Or the PK curs
1b230 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  or for WITHOUT R
1b240 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43  OWID */.  int iC
1b250 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ol,       /* Ind
1b260 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
1b270 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20   to extract */. 
1b280 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20   int regOut     
1b290 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
1b2a0 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20  value into this 
1b2b0 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1b2c0 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69   if( iCol<0 || i
1b2d0 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  Col==pTab->iPKey
1b2e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1b2f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b300 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20  Rowid, iTabCur, 
1b310 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  regOut);.  }else
1b320 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49  {.    int op = I
1b330 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
1b340 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50   OP_VColumn : OP
1b350 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74  _Column;.    int
1b360 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69   x = iCol;.    i
1b370 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
1b380 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  b) && !IsVirtual
1b390 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
1b3a0 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
1b3b0 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33  nOfIndex(sqlite3
1b3c0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1b3d0 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20  pTab), iCol);.  
1b3e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1b3f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1b400 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67   iTabCur, x, reg
1b410 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Out);.  }.  if( 
1b420 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  iCol>=0 ){.    s
1b430 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
1b440 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
1b450 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
1b460 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1b470 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1b480 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
1b490 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
1b4a0 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
1b4b0 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
1b4c0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1b4d0 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a  a register. .**.
1b4e0 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69 73 20  ** An effort is 
1b4f0 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  made to store th
1b500 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1b510 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  n register iReg.
1b520 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74    This.** is not
1b530 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f 72 20   garanteeed for 
1b540 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68  GetColumn() - th
1b550 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62 65 20  e result can be 
1b560 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79  stored in.** any
1b570 20 72 65 67 69 73 74 65 72 2e 20 20 42 75 74 20   register.  But 
1b580 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 67 75  the result is gu
1b590 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64  aranteed to land
1b5a0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1b5b0 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75  g.** for GetColu
1b5c0 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a  mnToReg()..**.**
1b5d0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1b5e0 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f  n open cursor to
1b5f0 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20   pTab in iTable 
1b600 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
1b610 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  e.** is called. 
1b620 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
1b630 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  en code is gener
1b640 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
1b650 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f  ts the rowid..*/
1b660 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1b670 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20  CodeGetColumn(. 
1b680 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1b690 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1b6a0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1b6b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1b6c0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
1b6d0 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1b6e0 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
1b6f0 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
1b700 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
1b710 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1b720 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1b730 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
1b740 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
1b750 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1b760 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
1b770 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20   int iReg,      
1b780 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
1b790 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20  ts here */.  u8 
1b7a0 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p5            /*
1b7b0 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50   P5 value for OP
1b7c0 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20  _Column + FLAGS 
1b7d0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
1b7e0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1b7f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1b800 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
1b810 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
1b820 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1b830 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
1b840 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
1b850 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
1b860 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  g>0 && p->iTable
1b870 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69  ==iTable && p->i
1b880 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
1b890 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  ){.      p->lru 
1b8a0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1b8b0 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Cnt++;.      sql
1b8c0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
1b8d0 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
1b8e0 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20   p->iReg);.     
1b8f0 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b   return p->iReg;
1b900 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61  .    }.  }  .  a
1b910 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
1b920 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b930 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1b940 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
1b950 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
1b960 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20  ;.  if( p5 ){.  
1b970 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1b980 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
1b990 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71  }else{   .    sq
1b9a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1b9b0 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ore(pParse, iTab
1b9c0 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
1b9d0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
1b9e0 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71   iReg;.}.void sq
1b9f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1ba00 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50  ColumnToReg(.  P
1ba10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1ba20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
1ba30 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
1ba40 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
1ba50 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
1ba60 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1ba70 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
1ba80 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
1ba90 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
1baa0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1bab0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
1bac0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1bad0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1bae0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1baf0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
1bb00 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20  nt iReg         
1bb10 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
1bb20 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1bb30 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78  t r1 = sqlite3Ex
1bb40 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1bb50 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43  pParse, pTab, iC
1bb60 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69  olumn, iTable, i
1bb70 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  Reg, 0);.  if( r
1bb80 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65  1!=iReg ) sqlite
1bb90 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1bba0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
1bbb0 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a  opy, r1, iReg);.
1bbc0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  }.../*.** Clear 
1bbd0 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  all column cache
1bbe0 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69   entries..*/.voi
1bbf0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1bc00 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  heClear(Parse *p
1bc10 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Parse){.  int i;
1bc20 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1bc30 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53 51 4c  che *p;..#if SQL
1bc40 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1bc50 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
1bc60 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
1bc70 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
1bc80 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e   printf("CLEAR\n
1bc90 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
1bca0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1bcb0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1bcc0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
1bcd0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
1bce0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29     if( p->iReg )
1bcf0 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
1bd00 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
1bd10 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  p);.    }.  }.}.
1bd20 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
1bd30 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61  e fact that an a
1bd40 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68  ffinity change h
1bd50 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69  as occurred on i
1bd60 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65  Count.** registe
1bd70 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  rs starting with
1bd80 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64   iStart..*/.void
1bd90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1bda0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1bdb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1bdc0 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
1bdd0 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  Count){.  sqlite
1bde0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
1bdf0 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c  (pParse, iStart,
1be00 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a   iCount);.}../*.
1be10 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1be20 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
1be30 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
1be40 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
1be50 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
1be60 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
1be70 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e   Keep the column
1be80 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74   cache up-to-dat
1be90 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1bea0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
1beb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1bec0 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
1bed0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61  , int nReg){.  a
1bee0 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54  ssert( iFrom>=iT
1bef0 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b  o+nReg || iFrom+
1bf00 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73  nReg<=iTo );.  s
1bf10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1bf20 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1bf30 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20  OP_Move, iFrom, 
1bf40 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71  iTo, nReg);.  sq
1bf50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
1bf60 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46 72  move(pParse, iFr
1bf70 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69  om, nReg);.}..#i
1bf80 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1bf90 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1bfa0 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  ed(SQLITE_COVERA
1bfb0 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  GE_TEST)./*.** R
1bfc0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
1bfd0 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  y register in th
1bfe0 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69  e range iFrom..i
1bff0 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a  To (inclusive).*
1c000 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  * is used as par
1c010 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
1c020 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
1c030 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1c040 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  d within assert(
1c050 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29  ) and testcase()
1c060 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20   macros only.** 
1c070 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  and does not app
1c080 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20  ear in a normal 
1c090 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
1c0a0 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d   int usedAsColum
1c0b0 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  nCache(Parse *pP
1c0c0 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
1c0d0 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74   int iTo){.  int
1c0e0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1c0f0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
1c100 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1c110 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
1c120 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
1c130 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1c140 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
1c150 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d      if( r>=iFrom
1c160 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74   && r<=iTo ) ret
1c170 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54  urn 1;    /*NO_T
1c180 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  EST*/.  }.  retu
1c190 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
1c1a0 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c  * SQLITE_DEBUG |
1c1b0 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  | SQLITE_COVERAG
1c1c0 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  E_TEST */.../*.*
1c1d0 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c  * Convert a scal
1c1e0 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ar expression no
1c1f0 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53  de to a TK_REGIS
1c200 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a  TER referencing.
1c210 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52 65 67  ** register iReg
1c220 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  .  The caller mu
1c230 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  st ensure that i
1c240 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  Reg already cont
1c250 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72  ains.** the corr
1c260 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1c270 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  e expression..*/
1c280 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1c290 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72  rToRegister(Expr
1c2a0 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a   *p, int iReg){.
1c2b0 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70    p->op2 = p->op
1c2c0 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52  ;.  p->op = TK_R
1c2d0 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54  EGISTER;.  p->iT
1c2e0 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45  able = iReg;.  E
1c2f0 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
1c300 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a  (p, EP_Skip);.}.
1c310 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20  ./*.** Evaluate 
1c320 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65  an expression (e
1c330 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f  ither a vector o
1c340 72 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  r a scalar expre
1c350 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65  ssion) and store
1c360 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69  .** the result i
1c370 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65  n continguous te
1c380 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1c390 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  s.  Return the i
1c3a0 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ndex of.** the f
1c3b0 69 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73  irst register us
1c3c0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
1c3d0 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  result..**.** If
1c3e0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65   the returned re
1c3f0 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
1c400 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61   a temporary sca
1c410 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77  lar, then also w
1c420 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67  rite.** that reg
1c430 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74  ister number int
1c440 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20  o *piFreeable.  
1c450 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
1c460 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a  result register.
1c470 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  ** is not a temp
1c480 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20  orary or if the 
1c490 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1c4a0 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72  vector set *piFr
1c4b0 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a  eeable.** to 0..
1c4c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
1c4d0 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72  prCodeVector(Par
1c4e0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1c4f0 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65   *p, int *piFree
1c500 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65  able){.  int iRe
1c510 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73  sult;.  int nRes
1c520 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ult = sqlite3Exp
1c530 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a  rVectorSize(p);.
1c540 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31    if( nResult==1
1c550 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20   ){.    iResult 
1c560 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c570 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c  eTemp(pParse, p,
1c580 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20   piFreeable);.  
1c590 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72  }else{.    *piFr
1c5a0 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  eeable = 0;.    
1c5b0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  if( p->op==TK_SE
1c5c0 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 69 52  LECT ){.      iR
1c5d0 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 43  esult = sqlite3C
1c5e0 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
1c5f0 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20  rse, p, 0, 0);. 
1c600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c610 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 52 65  int i;.      iRe
1c620 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  sult = pParse->n
1c630 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61  Mem+1;.      pPa
1c640 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
1c650 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  sult;.      for(
1c660 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20  i=0; i<nResult; 
1c670 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
1c680 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1c690 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  arse, p->x.pList
1c6a0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 2b  ->a[i].pExpr, i+
1c6b0 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  iResult);.      
1c6c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
1c6d0 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d 0a  turn iResult;.}.
1c6e0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1c6f0 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
1c700 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
1c710 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
1c720 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  n.** expression.
1c730 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f    Attempt to sto
1c740 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1c750 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67  n register "targ
1c760 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  et"..** Return t
1c770 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72  he register wher
1c780 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
1c790 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ored..**.** With
1c7a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
1c7b0 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61  here is no guara
1c7c0 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74  ntee that result
1c7d0 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f  s will.** be sto
1c7e0 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20  red in target.  
1c7f0 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74  The result might
1c800 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f   be stored in so
1c810 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69  me other.** regi
1c820 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f  ster if it is co
1c830 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73  nvenient to do s
1c840 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  o.  The calling 
1c850 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
1c860 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
1c870 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20  n code and move 
1c880 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74  the results to t
1c890 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65  he desired.** re
1c8a0 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  gister..*/.int s
1c8b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1c8c0 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72  rget(Parse *pPar
1c8d0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1c8e0 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
1c8f0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1c900 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65  ->pVdbe;  /* The
1c910 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72   VM under constr
1c920 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
1c930 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1c940 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
1c950 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ode being coded 
1c960 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d  */.  int inReg =
1c970 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f   target;       /
1c980 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64  * Results stored
1c990 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52   in register inR
1c9a0 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  eg */.  int regF
1c9b0 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ree1 = 0;       
1c9c0 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
1c9d0 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
1c9e0 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
1c9f0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
1ca00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
1ca10 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
1ca20 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
1ca30 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
1ca40 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20 20 20  t r1, r2;       
1ca50 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f          /* Vario
1ca60 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  us register numb
1ca70 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ers */.  sqlite3
1ca80 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1ca90 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  b; /* The databa
1caa0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1cab0 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20  .  Expr tempX;  
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cad0 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73  Temporary expres
1cae0 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  sion node */.  i
1caf0 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73  nt p5 = 0;..  as
1cb00 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
1cb10 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
1cb20 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
1cb30 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  v==0 ){.    asse
1cb40 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
1cb50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1cb60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1cb70 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  }..  if( pExpr==
1cb80 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
1cb90 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
1cba0 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
1cbb0 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
1cbc0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1cbd0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
1cbe0 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1cbf0 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
1cc00 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
1cc10 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1cc20 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
1cc30 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
1cc40 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
1cc50 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
1cc60 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
1cc70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1cc80 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
1cc90 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
1cca0 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20  Col->iMem;.     
1ccb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ccc0 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
1ccd0 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
1cce0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
1ccf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1cd00 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
1cd10 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
1cd20 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  xPTab,.         
1cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd40 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1cd50 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
1cd60 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1cd70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cd80 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  /* Otherwise, fa
1cd90 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
1cda0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20   TK_COLUMN case 
1cdb0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
1cdc0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
1cdd0 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20       int iTab = 
1cde0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
1cdf0 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20       if( iTab<0 
1ce00 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1ce10 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20  Parse->ckBase>0 
1ce20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1ce30 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43 4b  Generating CHECK
1ce40 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20   constraints or 
1ce50 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 70  inserting into p
1ce60 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a  artial index */.
1ce70 20 20 20 20 20 20 20 20 20 20 69 6e 52 65 67 20            inReg 
1ce80 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
1ce90 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73   + pParse->ckBas
1cea0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  e;.          bre
1ceb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1cec0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1ced0 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72 65 73  Coding an expres
1cee0 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61 72  sion that is par
1cef0 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 77 68  t of an index wh
1cf00 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ere column names
1cf10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
1cf20 20 74 68 65 20 69 6e 64 65 78 20 72 65 66 65 72   the index refer
1cf30 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74 6f   to the table to
1cf40 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78   which the index
1cf50 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20   belongs */.    
1cf60 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50 61        iTab = pPa
1cf70 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20  rse->iSelfTab;. 
1cf80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cf90 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
1cfa0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1cfb0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
1cfc0 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20  pExpr->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 20 20 20 20 20 20 70 45 78 70              pExp
1cff0 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62  r->iColumn, iTab
1d000 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d020 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1d030 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61  op2);.      brea
1d040 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1d050 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
1d060 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
1d070 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
1d080 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1d090 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d0a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d0b0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1d0c0 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  NT.    case TK_F
1d0d0 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  LOAT: {.      as
1d0e0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1d0f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1d100 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1d110 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1d120 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1d130 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1d140 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d150 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1d160 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
1d170 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1d180 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1d190 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1d1a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d1b0 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
1d1c0 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70 72 2d  , target, pExpr-
1d1d0 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1d1e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1d1f0 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
1d200 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1d210 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d220 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
1d230 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1d240 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1d250 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
1d260 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
1d270 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
1d280 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
1d290 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
1d2a0 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a     char *zBlob;.
1d2b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1d2c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d2d0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1d2e0 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
1d2f0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1d300 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  ken[0]=='x' || p
1d310 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1d320 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
1d330 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1d340 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27  .zToken[1]=='\''
1d350 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70   );.      z = &p
1d360 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32  Expr->u.zToken[2
1d370 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ];.      n = sql
1d380 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
1d390 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
1d3a0 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b  t( z[n]=='\'' );
1d3b0 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73  .      zBlob = s
1d3c0 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
1d3d0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
1d3e0 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
1d3f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d400 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32  (v, OP_Blob, n/2
1d410 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c  , target, 0, zBl
1d420 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ob, P4_DYNAMIC);
1d430 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d440 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1d450 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
1d460 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1d470 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1d480 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1d490 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
1d4a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1d4b0 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20  zToken!=0 );.   
1d4c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1d4d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30  ->u.zToken[0]!=0
1d4e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1d4f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d500 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
1d510 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  r->iColumn, targ
1d520 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
1d530 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1d540 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
1d550 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1d560 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20  .zToken[0]=='?' 
1d570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
1d580 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
1d590 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d  .zToken, pParse-
1d5a0 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43  >azVar[pExpr->iC
1d5b0 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a  olumn-1])==0 );.
1d5c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1d5d0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
1d5e0 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  1, pParse->azVar
1d5f0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  [pExpr->iColumn-
1d600 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  1], P4_STATIC);.
1d610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1d620 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1d630 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
1d640 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
1d650 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
1d660 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d670 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1d680 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20  E_OMIT_CAST.    
1d690 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a  case TK_CAST: {.
1d6a0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
1d6b0 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
1d6c0 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41  :   CAST(pLeft A
1d6d0 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20  S token) */.    
1d6e0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1d6f0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1d700 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1d710 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
1d720 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
1d730 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
1d740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d750 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
1d760 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
1d770 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1d780 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
1d790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d7a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1d7b0 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20  ast, target,.   
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7d0 20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69       sqlite3Affi
1d7e0 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e  nityType(pExpr->
1d7f0 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20  u.zToken, 0));. 
1d800 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75       testcase( u
1d810 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1d820 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1d830 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20  inReg) );.      
1d840 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1d850 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1d860 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29  Parse, inReg, 1)
1d870 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d880 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1d890 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
1d8a0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
1d8b0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
1d8c0 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20 3d  SNOT:.      op =
1d8d0 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
1d8e0 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
1d8f0 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45 5f      p5 = SQLITE_
1d900 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a  NULLEQ;.      /*
1d910 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f   fall-through */
1d920 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1d930 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
1d940 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
1d950 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
1d960 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
1d970 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
1d980 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1d990 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
1d9a0 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  eft;.      if( s
1d9b0 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
1d9c0 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20 20  or(pLeft) ){.   
1d9d0 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72 43       codeVectorC
1d9e0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1d9f0 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f 70  Expr, target, op
1da00 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , p5);.      }el
1da10 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
1da20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1da30 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65  Temp(pParse, pLe
1da40 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1da50 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
1da60 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1da70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1da80 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1da90 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  2);.        code
1daa0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1dab0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1dac0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1dad0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e        r1, r2, in
1dae0 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52  Reg, SQLITE_STOR
1daf0 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20 20  EP2 | p5);.     
1db00 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
1db10 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
1db20 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
1db30 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1db40 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
1db50 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
1db60 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
1db70 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
1db80 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1db90 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
1dba0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
1dbb0 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
1dbc0 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
1dbd0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1dbe0 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
1dbf0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
1dc00 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
1dc10 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
1dc20 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1dc30 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
1dc40 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
1dc50 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
1dc60 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64  e(op==OP_Eq); Vd
1dc70 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1dc80 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
1dc90 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
1dca0 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
1dcb0 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64  e(op==OP_Ne); Vd
1dcc0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1dcd0 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
1dce0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1dcf0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1dd00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1dd10 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1dd20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1dd30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1dd40 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
1dd50 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
1dd60 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
1dd70 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
1dd80 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
1dd90 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
1dda0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1ddb0 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
1ddc0 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
1ddd0 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
1dde0 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
1ddf0 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
1de00 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
1de10 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
1de20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
1de30 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20  OP_And );       
1de40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1de50 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
1de60 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
1de70 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20  ==OP_Or );      
1de80 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1de90 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
1dea0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1deb0 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20  PLUS==OP_Add ); 
1dec0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1ded0 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
1dee0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1def0 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75   TK_MINUS==OP_Su
1df00 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74 65  btract );     te
1df10 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d  stcase( op==TK_M
1df20 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73  INUS );.      as
1df30 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
1df40 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20  _Remainder );   
1df50 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1df60 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20  =TK_REM );.     
1df70 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
1df80 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
1df90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dfa0 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b  op==TK_BITAND );
1dfb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1dfc0 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
1dfd0 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73 74  r );        test
1dfe0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1dff0 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
1e000 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
1e010 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20 20  _Divide );      
1e020 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e030 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20  K_SLASH );.     
1e040 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
1e050 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
1e060 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1e070 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b  op==TK_LSHIFT );
1e080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e090 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
1e0a0 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73 74  ftRight );  test
1e0b0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
1e0c0 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
1e0d0 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
1e0e0 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20  OP_Concat );    
1e0f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e100 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20  TK_CONCAT );.   
1e110 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1e120 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e130 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e140 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1e150 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1e160 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e170 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1e180 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1e190 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e1a0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
1e1b0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
1e1c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e1d0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e1e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e1f0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1e200 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e210 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
1e220 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
1e230 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
1e240 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
1e250 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
1e260 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
1e270 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
1e280 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49  ){.        codeI
1e290 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
1e2a0 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29  Left, 1, target)
1e2b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1e2c0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1e2d0 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65  OINT.      }else
1e2e0 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
1e2f0 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
1e300 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1e310 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e320 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1e330 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
1e340 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75  Real(v, pLeft->u
1e350 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67  .zToken, 1, targ
1e360 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  et);.#endif.    
1e370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e380 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49   tempX.op = TK_I
1e390 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20  NTEGER;.        
1e3a0 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50  tempX.flags = EP
1e3b0 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b  _IntValue|EP_Tok
1e3c0 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20  enOnly;.        
1e3d0 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d  tempX.u.iValue =
1e3e0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d   0;.        r1 =
1e3f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e400 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65  Temp(pParse, &te
1e410 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b  mpX, &regFree1);
1e420 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
1e430 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e440 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e450 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1e460 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
1e470 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1e480 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32   OP_Subtract, r2
1e490 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
1e4a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1e4b0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1e4c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
1e4d0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
1e4e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e4f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1e500 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
1e510 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
1e520 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
1e530 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20  =OP_BitNot );   
1e540 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1e550 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20  _BITNOT );.     
1e560 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d   assert( TK_NOT=
1e570 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20  =OP_Not );      
1e580 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e590 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_NOT );.     
1e5a0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1e5b0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e5c0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1e5d0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1e5e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1e5f0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1e600 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
1e610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e620 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
1e630 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  r1, inReg);.    
1e640 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e650 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
1e660 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
1e670 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
1e680 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
1e690 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
1e6a0 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20  L==OP_IsNull ); 
1e6b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e6c0 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
1e6d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1e6e0 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
1e6f0 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f  l ); testcase( o
1e700 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
1e710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e720 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1e730 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
1e740 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  t);.      r1 = s
1e750 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e760 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e770 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1e780 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
1e790 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1e7a0 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
1e7b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e7c0 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20  p1(v, op, r1);. 
1e7d0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1e7e0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
1e7f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
1e800 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1e810 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
1e820 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e830 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1e840 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74  teger, 0, target
1e850 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e860 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1e870 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65  addr);.      bre
1e880 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1e890 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
1e8a0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  ON: {.      AggI
1e8b0 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78  nfo *pInfo = pEx
1e8c0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
1e8d0 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30      if( pInfo==0
1e8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1e8f0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e900 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1e910 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1e920 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1e930 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
1e940 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
1e950 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e  : %s()", pExpr->
1e960 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1e970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e980 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61  inReg = pInfo->a
1e990 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67  Func[pExpr->iAgg
1e9a0 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ].iMem;.      }.
1e9b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e9c0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
1e9d0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
1e9e0 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67   ExprList *pFarg
1e9f0 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
1ea00 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
1ea10 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
1ea20 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20  nt nFarg;       
1ea30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1ea40 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
1ea50 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46  ments */.      F
1ea60 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
1ea70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
1ea80 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
1ea90 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20   object */.     
1eaa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
1eab0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;       /* The f
1eac0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1ead0 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d        u32 constM
1eae0 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ask = 0;     /* 
1eaf0 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e  Mask of function
1eb00 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20   arguments that 
1eb10 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a  are constant */.
1eb20 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb40 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1eb50 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
1eb60 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20  NC(db);      /* 
1eb70 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  The text encodin
1eb80 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20 64  g used by this d
1eb90 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
1eba0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
1ebb0 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c  = 0;    /* A col
1ebc0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1ebd0 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  */..      assert
1ebe0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1ebf0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1ec00 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
1ec10 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1ec20 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
1ec30 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
1ec40 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a       pFarg = 0;.
1ec50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ec60 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78       pFarg = pEx
1ec70 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
1ec80 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67     }.      nFarg
1ec90 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72 67   = pFarg ? pFarg
1eca0 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
1ecb0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1ecc0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ecd0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1ece0 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70  );.      zId = p
1ecf0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
1ed00 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
1ed10 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
1ed20 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67 2c  (db, zId, nFarg,
1ed30 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65 66   enc, 0);.#ifdef
1ed40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
1ed50 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54  NKNOWN_SQL_FUNCT
1ed60 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70 44  ION.      if( pD
1ed70 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  ef==0 && pParse-
1ed80 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
1ed90 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
1eda0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
1edb0 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46  b, "unknown", nF
1edc0 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  arg, enc, 0);.  
1edd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1ede0 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 7c     if( pDef==0 |
1edf0 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a  | pDef->xFinaliz
1ee00 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
1ee10 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1ee20 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
1ee30 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22   function: %s()"
1ee40 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
1ee50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1ee60 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
1ee70 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d   a direct implem
1ee80 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
1ee90 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43  built-in COALESC
1eea0 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  E() and.      **
1eeb0 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69   IFNULL() functi
1eec0 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64  ons.  This avoid
1eed0 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76  s unnecessary ev
1eee0 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20  aluation of.    
1eef0 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70    ** arguments p
1ef00 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f  ast the first no
1ef10 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  n-NULL argument.
1ef20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1ef30 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
1ef40 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
1ef50 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
1ef60 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
1ef70 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
1ef80 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1ef90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1efa0 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20   nFarg>=2 );.   
1efb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1efc0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
1efd0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
1efe0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1eff0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72   for(i=1; i<nFar
1f000 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
1f010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f020 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
1f030 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43  ll, target, endC
1f040 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
1f050 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f060 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
1f070 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
1f080 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61  emove(pParse, ta
1f090 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rget, 1);.      
1f0a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f0b0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1f0c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1f0d0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1f0e0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
1f0f0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1f100 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f110 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1f120 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  arse);.        }
1f130 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f140 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1f150 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  (v, endCoalesce)
1f160 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1f170 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1f180 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28  /* The UNLIKELY(
1f190 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  ) function is a 
1f1a0 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75  no-op.  The resu
1f1b0 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a  lt is the value.
1f1c0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
1f1d0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
1f1e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1f1f0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
1f200 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
1f210 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20  _UNLIKELY ){.   
1f220 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
1f230 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg>=1 );.       
1f240 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1f250 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1f260 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
1f270 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
1f280 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1f290 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1f2a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72   for(i=0; i<nFar
1f2b0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
1f2c0 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c   if( i<32 && sql
1f2d0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
1f2e0 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  nt(pFarg->a[i].p
1f2f0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1f300 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
1f310 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  31 );.          
1f320 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53  constMask |= MAS
1f330 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20  KBIT32(i);.     
1f340 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1f350 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
1f360 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
1f370 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20  NEEDCOLL)!=0 && 
1f380 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
1f390 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1f3a0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1f3b0 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
1f3c0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
1f3d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f3e0 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
1f3f0 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73          if( cons
1f400 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20  tMask ){.       
1f410 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e     r1 = pParse->
1f420 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
1f430 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1f440 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20  = nFarg;.       
1f450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f460 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
1f470 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1f480 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  e, nFarg);.     
1f490 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1f4a0 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e   For length() an
1f4b0 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74  d typeof() funct
1f4c0 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75  ions with a colu
1f4d0 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20  mn argument,.   
1f4e0 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20       ** set the 
1f4f0 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  P5 parameter to 
1f500 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70  the OP_Column op
1f510 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c  code to OPFLAG_L
1f520 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20 20  ENGTHARG.       
1f530 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59   ** or OPFLAG_TY
1f540 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74 69  PEOFARG respecti
1f550 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75  vely, to avoid u
1f560 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61 0a  nnecessary data.
1f570 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69          ** loadi
1f580 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ng..        */. 
1f590 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
1f5a0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53  ->funcFlags & (S
1f5b0 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
1f5c0 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  H|SQLITE_FUNC_TY
1f5d0 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20  PEOF))!=0 ){.   
1f5e0 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f 70         u8 exprOp
1f5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1f600 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a  rt( nFarg==1 );.
1f610 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1f620 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  ( pFarg->a[0].pE
1f630 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
1f640 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61      exprOp = pFa
1f650 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  rg->a[0].pExpr->
1f660 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  op;.          if
1f670 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c  ( exprOp==TK_COL
1f680 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54  UMN || exprOp==T
1f690 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1f6b0 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
1f6c0 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c  LENGTH==OPFLAG_L
1f6d0 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
1f6e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f6f0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
1f700 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f  OF==OPFLAG_TYPEO
1f710 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  FARG );.        
1f720 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
1f730 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1f740 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
1f750 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1f760 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
1f770 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20  r->op2 = .      
1f780 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66              pDef
1f790 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f  ->funcFlags & (O
1f7a0 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c  PFLAG_LENGTHARG|
1f7b0 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
1f7c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1f7d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1f7e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f7f0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20  hePush(pParse); 
1f800 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
1f810 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
1f820 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f830 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
1f840 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c  arse, pFarg, r1,
1f850 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f870 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f      SQLITE_ECEL_
1f880 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f  DUP|SQLITE_ECEL_
1f890 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20  FACTOR);.       
1f8a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f8b0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20  ePop(pParse);   
1f8c0 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
1f8d0 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
1f8e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f8f0 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20    r1 = 0;.      
1f900 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1f910 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1f920 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
1f930 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
1f940 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
1f950 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1f960 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
1f970 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
1f980 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
1f990 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
1f9a0 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
1f9b0 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
1f9c0 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
1f9d0 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
1f9e0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
1f9f0 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
1fa00 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
1fa10 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
1fa20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
1fa30 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
1fa40 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
1fa50 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
1fa60 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
1fa70 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
1fa80 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
1fa90 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
1faa0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
1fab0 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
1fac0 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
1fad0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1fae0 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
1faf0 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
1fb00 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
1fb10 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
1fb20 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
1fb30 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
1fb40 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
1fb50 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
1fb60 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
1fb70 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
1fb80 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
1fb90 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
1fba0 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
1fbb0 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
1fbc0 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20     if( nFarg>=2 
1fbd0 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
1fbe0 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
1fbf0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
1fc00 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
1fc10 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
1fc20 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
1fc30 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
1fc40 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
1fc50 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
1fc60 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
1fc70 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
1fc80 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
1fc90 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
1fca0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
1fcb0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1fcc0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
1fcd0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
1fce0 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
1fcf0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
1fd00 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
1fd10 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
1fd20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1fd30 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
1fd40 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
1fd50 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
1fd60 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
1fd70 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1fd80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1fd90 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 63 6f  OP_Function0, co
1fda0 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72  nstMask, r1, tar
1fdb0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1fdd0 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e  ar*)pDef, P4_FUN
1fde0 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c  CDEF);.      sql
1fdf0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1fe00 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a  (v, (u8)nFarg);.
1fe10 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20        if( nFarg 
1fe20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20  && constMask==0 
1fe30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1fe40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
1fe50 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
1fe60 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Farg);.      }. 
1fe70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fe80 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1fe90 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1fea0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
1feb0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
1fec0 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  ELECT: {.      i
1fed0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74  nt nCol;.      t
1fee0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fef0 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
1ff00 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ff10 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
1ff20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45   if( op==TK_SELE
1ff30 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45  CT && (nCol = pE
1ff40 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
1ff50 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d  pEList->nExpr)!=
1ff60 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1ff70 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
1ff80 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c  or(pParse, nCol,
1ff90 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
1ffa0 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  {.        inReg 
1ffb0 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
1ffc0 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
1ffd0 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Expr, 0, 0);.   
1ffe0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1fff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20000 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
20010 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
20020 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61  Expr->pLeft->iTa
20030 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble==0 ){.      
20040 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
20050 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  iTable = sqlite3
20060 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
20070 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
20080 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ft, 0, 0);.     
20090 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
200a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
200b0 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69  Table + pExpr->i
200c0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 62 72  Column;.      br
200d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
200e0 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
200f0 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
20100 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
20110 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
20120 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
20130 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
20140 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
20150 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20160 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
20170 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
20180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20190 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
201a0 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
201b0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
201c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
201d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
201e0 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
201f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20200 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
20210 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
20220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20230 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
20240 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30  ddImm, target, 0
20250 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20260 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
20270 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
20280 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20290 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
202a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
202b0 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20  RY */...    /*. 
202c0 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45     **    x BETWE
202d0 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a  EN y AND z.    *
202e0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  *.    ** This is
202f0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
20300 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
20310 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20  x>=y AND x<=z.  
20320 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73    **.    ** X is
20330 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
20340 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
20350 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Y is stored in p
20360 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
20370 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20  ].pExpr..    ** 
20380 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Z is stored in p
20390 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
203a0 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a  ].pExpr..    */.
203b0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
203c0 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78 70  EEN: {.      exp
203d0 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
203e0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
203f0 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  et, 0, 0);.     
20400 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20410 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a    case TK_SPAN:.
20420 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
20430 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
20440 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
20450 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
20460 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
20470 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
20480 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
20490 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
204a0 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  ..    case TK_TR
204b0 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f  IGGER: {.      /
204c0 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20  * If the opcode 
204d0 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74  is TK_TRIGGER, t
204e0 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
204f0 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  on is a referenc
20500 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20  e.      ** to a 
20510 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
20520 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65  w.* or old.* pse
20530 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c  udo-tables avail
20540 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
20550 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
20560 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
20570 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73  Expr.iTable is s
20580 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a  et to 1 for the.
20590 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70        ** new.* p
205a0 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20  seudo-table, or 
205b0 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20  0 for the old.* 
205c0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78  pseudo-table. Ex
205d0 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  pr.iColumn.     
205e0 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68   ** is set to th
205f0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
20600 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20  pseudo-table to 
20610 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74  read, or to -1 t
20620 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  o.      ** read 
20630 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e  the rowid field.
20640 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
20650 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
20660 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
20670 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72   using an OP_Par
20680 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70  am opcode. The p
20690 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d  1.      ** param
206a0 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30  eter is set to 0
206b0 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69   for an old.rowi
206c0 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20  d reference, or 
206d0 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a  to (i+1).      *
206e0 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61  * to reference a
206f0 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66  nother column of
20700 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
20710 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a  o-table, where .
20720 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68        ** i is th
20730 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
20740 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77  olumn. For a new
20750 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
20760 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a  , p1 is.      **
20770 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77   set to (n+1), w
20780 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75  here n is the nu
20790 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
207a0 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74  in each pseudo-t
207b0 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46  able..      ** F
207c0 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  or a reference t
207d0 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75  o any other colu
207e0 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
207f0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31  pseudo-table, p1
20800 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
20810 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65   to (n+2+i), whe
20820 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61  re n and i are a
20830 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f  s defined previo
20840 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20  usly. For.      
20850 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
20860 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63  he table on whic
20870 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62  h triggers are b
20880 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20  eing fired is.  
20890 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20      ** declared 
208a0 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  as:.      **.   
208b0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
208c0 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
208d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
208e0 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65   Then p1 is inte
208f0 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f  rpreted as follo
20900 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
20910 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20     **   p1==0   
20920 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20  ->    old.rowid 
20930 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20      p1==3   ->  
20940 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20    new.rowid.    
20950 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d    **   p1==1   -
20960 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20  >    old.a      
20970 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20     p1==4   ->   
20980 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20   new.a.      ** 
20990 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20    p1==2   ->    
209a0 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31  old.b         p1
209b0 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==5   ->    new.
209c0 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a  b       .      *
209d0 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
209e0 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
209f0 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20  b;.      int p1 
20a00 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
20a10 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  * (pTab->nCol+1)
20a20 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43   + 1 + pExpr->iC
20a30 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73  olumn;..      as
20a40 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
20a50 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
20a60 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  >iTable==1 );.  
20a70 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
20a80 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26  r->iColumn>=-1 &
20a90 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
20aa0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
20ab0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
20ac0 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45  b->iPKey<0 || pE
20ad0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54  xpr->iColumn!=pT
20ae0 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20  ab->iPKey );.   
20af0 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30     assert( p1>=0
20b00 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43   && p1<(pTab->nC
20b10 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20  ol*2+2) );..    
20b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20b30 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c  Op2(v, OP_Param,
20b40 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   p1, target);.  
20b50 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
20b60 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25  (v, "%s.%s -> $%
20b70 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  d",.        (pEx
20b80 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65  pr->iTable ? "ne
20b90 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20  w" : "old"),.   
20ba0 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f       (pExpr->iCo
20bb0 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22  lumn<0 ? "rowid"
20bc0 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e   : pExpr->pTab->
20bd0 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
20be0 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20  umn].zName),.   
20bf0 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20 20       target.    
20c00 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53    ));..#ifndef S
20c10 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
20c20 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
20c30 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
20c40 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69   has REAL affini
20c50 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65  ty, it may curre
20c60 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61  ntly be stored a
20c70 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  s an.      ** in
20c80 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65  teger. Use OP_Re
20c90 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61  alAffinity to ma
20ca0 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72 65  ke sure it is re
20cb0 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20 20  ally real..     
20cc0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49   **.      ** EVI
20cd0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38  DENCE-OF: R-6098
20ce0 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20 77  5-57662 SQLite w
20cf0 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 20  ill convert the 
20d00 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20 20  value back to.  
20d10 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20      ** floating 
20d20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72 61  point when extra
20d30 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74 68  cting it from th
20d40 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20  e record.  */.  
20d50 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
20d60 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20  Column>=0 .     
20d70 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b    && pTab->aCol[
20d80 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
20d90 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
20da0 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20  _AFF_REAL.      
20db0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20dc0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
20dd0 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c  OP_RealAffinity,
20de0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20df0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  }.#endif.      b
20e00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
20e10 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f 52 3a   case TK_VECTOR:
20e20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
20e30 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20e40 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75   "row value misu
20e50 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62 72 65  sed");.      bre
20e60 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
20e70 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
20e80 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
20e90 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
20ea0 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
20eb0 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
20ec0 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
20ed0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
20ee0 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
20ef0 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
20f00 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
20f10 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
20f20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
20f30 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
20f40 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
20f50 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
20f60 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
20f70 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
20f80 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
20f90 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
20fa0 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
20fb0 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
20fc0 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
20fd0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
20fe0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
20ff0 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
21000 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
21010 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
21020 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74  Y is in the last
21030 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70   element of pExp
21040 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45  r->x.pList if pE
21050 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
21060 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64  xpr is.    ** od
21070 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73  d.  The Y is als
21080 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20  o optional.  If 
21090 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
210a0 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73  ements in x.pLis
210b0 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e  t.    ** is even
210c0 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74  , then Y is omit
210d0 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68  ted and the "oth
210e0 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69  erwise" result i
210f0 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
21100 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
21110 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
21120 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
21130 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
21140 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
21150 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
21160 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
21170 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
21180 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
21190 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
211a0 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
211b0 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
211c0 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
211d0 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
211e0 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
211f0 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
21200 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
21210 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
21220 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21240 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
21250 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
21260 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
21270 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21290 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
212a0 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
212b0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
212c0 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
212f0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
21300 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21320 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
21330 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
21340 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
21350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21360 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
21370 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
21380 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
21390 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
213a0 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
213b0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
213c0 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
213d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
213e0 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
213f0 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
21400 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21420 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
21430 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
21440 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74       Expr *pTest
21450 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21460 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20         /* X==Ei 
21470 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74  (form A) or just
21480 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a   Ei (form B) */.
21490 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20        VVA_ONLY( 
214a0 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20  int iCacheLevel 
214b0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
214c0 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20  Level; )..      
214d0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
214e0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
214f0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26  EP_xIsSelect) &&
21500 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
21510 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21520 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
21530 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20  nExpr > 0);.    
21540 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
21550 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
21560 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c   aListelem = pEL
21570 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45  ist->a;.      nE
21580 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
21590 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61  xpr;.      endLa
215a0 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bel = sqlite3Vdb
215b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
215c0 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70       if( (pX = p
215d0 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
215e0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  ){.        tempX
215f0 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20   = *pX;.        
21600 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
21610 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
21620 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67         exprToReg
21630 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78  ister(&tempX, ex
21640 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
21650 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
21660 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20  gFree1));.      
21670 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
21680 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
21690 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d     memset(&opCom
216a0 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pare, 0, sizeof(
216b0 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20  opCompare));.   
216c0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
216d0 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
216e0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
216f0 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20  ft = &tempX;.   
21700 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
21710 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
21720 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
21730 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
21740 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
21750 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
21760 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
21770 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
21780 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
21790 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
217a0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
217b0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
217c0 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
217d0 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
217e0 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
217f0 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
21800 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
21810 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
21820 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
21830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21840 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
21850 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  -1; i=i+2){.    
21860 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21870 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
21880 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  ;.        if( pX
21890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
218a0 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29  sert( pTest!=0 )
218b0 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f  ;.          opCo
218c0 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61  mpare.pRight = a
218d0 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
218e0 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
218f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73  {.          pTes
21900 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
21910 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
21920 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61  }.        nextCa
21930 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
21940 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
21950 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21960 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pTest->op==TK_CO
21970 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
21980 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
21990 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74  se(pParse, pTest
219a0 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49  , nextCase, SQLI
219b0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
219c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
219d0 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
219e0 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  .pExpr->op==TK_C
219f0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
21a00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21a10 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
21a20 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74  em[i+1].pExpr, t
21a30 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
21a40 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
21a50 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  v, endLabel);.  
21a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21a70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
21a80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21a90 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21aa0 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b  el(v, nextCase);
21ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21ac0 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20  f( (nExpr&1)!=0 
21ad0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21ae0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
21af0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
21b00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21b10 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
21b20 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70  >a[nExpr-1].pExp
21b30 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
21b40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21b50 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
21b60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21b80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
21b90 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
21ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
21bb0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
21bc0 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
21bd0 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20  ->nErr>0 .      
21be0 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
21bf0 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61  iCacheLevel==iCa
21c00 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20  cheLevel );.    
21c10 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
21c20 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
21c30 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  Label);.      br
21c40 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
21c50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
21c60 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
21c70 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
21c80 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
21c90 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f  >affinity==OE_Ro
21ca0 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20  llback .        
21cb0 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
21cc0 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a  inity==OE_Abort.
21cd0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
21ce0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
21cf0 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20  E_Fail.         
21d00 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
21d10 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a  nity==OE_Ignore.
21d20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
21d30 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69  f( !pParse->pTri
21d40 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20  ggerTab ){.     
21d50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
21d60 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
21d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d80 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
21d90 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
21da0 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
21db0 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
21dc0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
21dd0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
21de0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
21df0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
21e00 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
21e10 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
21e20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
21e30 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
21e40 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
21e50 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66  lue) );.      if
21e60 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
21e70 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  y==OE_Ignore ){.
21e80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21e90 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
21ea0 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c         v, OP_Hal
21eb0 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45  t, SQLITE_OK, OE
21ec0 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70  _Ignore, 0, pExp
21ed0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a  r->u.zToken,0);.
21ee0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
21ef0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
21f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
21f10 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
21f20 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49  int(pParse, SQLI
21f30 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
21f40 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20  IGGER,.         
21f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f60 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
21f70 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  nity, pExpr->u.z
21f80 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  Token, 0, 0);.  
21f90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65      }..      bre
21fa0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
21fb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
21fc0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
21fd0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
21fe0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
21ff0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
22000 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74  regFree2);.  ret
22010 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
22020 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74  .** Factor out t
22030 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67  he code of the g
22040 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
22050 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
22060 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n time..*/.void 
22070 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
22080 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a  tInit(.  Parse *
22090 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
220a0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
220b0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
220c0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
220d0 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77  ession to code w
220e0 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69  hen the VDBE ini
220f0 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e  tializes */.  in
22100 74 20 72 65 67 44 65 73 74 2c 20 20 20 20 20 20  t regDest,      
22110 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c  /* Store the val
22120 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
22130 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 75 73  ter */.  u8 reus
22140 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20 54 72  able       /* Tr
22150 75 65 20 69 66 20 74 68 69 73 20 65 78 70 72 65  ue if this expre
22160 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61 62 6c  ssion is reusabl
22170 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  e */.){.  ExprLi
22180 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  st *p;.  assert(
22190 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
221a0 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20  Parse) );.  p = 
221b0 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
221c0 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  pr;.  pExpr = sq
221d0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
221e0 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
221f0 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  0);.  p = sqlite
22200 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
22210 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72  pParse, p, pExpr
22220 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
22230 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
22240 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
22250 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d   &p->a[p->nExpr-
22260 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  1];.     pItem->
22270 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20  u.iConstExprReg 
22280 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20 20 20  = regDest;.     
22290 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
222a0 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20 7d 0a  = reusable;.  }.
222b0 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74    pParse->pConst
222c0 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a  Expr = p;.}../*.
222d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
222e0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
222f0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
22300 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
22310 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73  .** into a regis
22320 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ter.  Return the
22330 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
22340 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c   where the resul
22350 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  ts.** are stored
22360 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
22370 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
22380 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
22390 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c  that can be deal
223a0 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e  located,.** then
223b0 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65   write its numbe
223c0 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49  r into *pReg.  I
223d0 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67  f the result reg
223e0 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20  ister is not.** 
223f0 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65  a temporary, the
22400 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a  n set *pReg to z
22410 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ero..**.** If pE
22420 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  xpr is a constan
22430 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
22440 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72  tine might gener
22450 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65  ate this.** code
22460 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67   to fill the reg
22470 69 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69  ister in the ini
22480 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74  tialization sect
22490 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44  ion of the.** VD
224a0 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f  BE program, in o
224b0 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69  rder to factor i
224c0 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61  t out of the eva
224d0 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f  luation loop..*/
224e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
224f0 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a  CodeTemp(Parse *
22500 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
22510 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b  xpr, int *pReg){
22520 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78  .  int r2;.  pEx
22530 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
22540 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70  SkipCollate(pExp
22550 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46  r);.  if( ConstF
22560 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a  actorOk(pParse).
22570 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21     && pExpr->op!
22580 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20  =TK_REGISTER.   
22590 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
225a0 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
225b0 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20  pExpr).  ){.    
225c0 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 70 50  ExprList *p = pP
225d0 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
225e0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
225f0 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20   *pReg  = 0;.   
22600 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
22610 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
22620 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
22630 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e     for(pItem=p->
22640 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69  a, i=p->nExpr; i
22650 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d  >0; pItem++, i--
22660 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
22670 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26  Item->reusable &
22680 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
22690 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  pare(pItem->pExp
226a0 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29  r,pExpr,-1)==0 )
226b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
226c0 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e  rn pItem->u.iCon
226d0 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20  stExprReg;.     
226e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
226f0 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b 70 50   }.    r2 = ++pP
22700 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
22710 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
22720 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
22730 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20 20 7d  xpr, r2, 1);.  }
22740 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31  else{.    int r1
22750 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
22760 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
22770 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
22780 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
22790 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b  rse, pExpr, r1);
227a0 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20  .    if( r2==r1 
227b0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  ){.      *pReg =
227c0 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   r1;.    }else{.
227d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
227e0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
227f0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a  se, r1);.      *
22800 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
22810 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b    }.  return r2;
22820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
22830 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
22840 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
22850 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
22860 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
22870 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
22880 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
22890 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
228a0 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
228b0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
228c0 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rget..*/.void sq
228d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
228e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
228f0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
22900 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52  rget){.  int inR
22910 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  eg;..  assert( t
22920 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
22930 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
22940 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26  );.  if( pExpr &
22950 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  & pExpr->op==TK_
22960 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
22970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22980 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
22990 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d   OP_Copy, pExpr-
229a0 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29  >iTable, target)
229b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
229c0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
229d0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
229e0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
229f0 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  et);.    assert(
22a00 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
22a10 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
22a20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
22a30 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d  .    if( inReg!=
22a40 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65  target && pParse
22a50 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20  ->pVdbe ){.     
22a60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22a70 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
22a80 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
22a90 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
22aa0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  }.  }.}../*.** M
22ab0 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ake a transient 
22ac0 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
22ad0 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68 65  on pExpr and the
22ae0 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67 0a  n code it using.
22af0 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ** sqlite3ExprCo
22b00 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  de().  This rout
22b10 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  ine works just l
22b20 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  ike sqlite3ExprC
22b30 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74 20  ode().** except 
22b40 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20 65  that the input e
22b50 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75 61  xpression is gua
22b60 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e  ranteed to be un
22b70 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64  changed..*/.void
22b80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22b90 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72  Copy(Parse *pPar
22ba0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
22bb0 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
22bc0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
22bd0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70  arse->db;.  pExp
22be0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
22bf0 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
22c00 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  ;.  if( !db->mal
22c10 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c 69  locFailed ) sqli
22c20 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
22c30 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
22c40 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
22c50 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
22c60 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  r);.}../*.** Gen
22c70 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
22c80 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
22c90 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
22ca0 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
22cb0 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
22cc0 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
22cd0 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
22ce0 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
22cf0 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
22d00 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68 65   target.  If the
22d10 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
22d20 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
22d30 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
22d40 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f  ght choose to co
22d50 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  de the expressio
22d60 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  n at initializat
22d70 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
22d80 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
22d90 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73  eFactorable(Pars
22da0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
22db0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
22dc0 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  et){.  if( pPars
22dd0 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
22de0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
22df0 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29  sConstant(pExpr)
22e00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
22e10 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
22e20 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
22e30 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  get, 0);.  }else
22e40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
22e50 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
22e60 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
22e70 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
22e80 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
22e90 61 6c 75 61 74 65 73 20 74 68 65 20 67 69 76 65  aluates the give
22ea0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
22eb0 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74   puts the result
22ec0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
22ed0 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  target..**.** Al
22ee0 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  so make a copy o
22ef0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
22f00 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e   results into an
22f10 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65  other "cache" re
22f20 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f  gister.** and mo
22f30 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73  dify the express
22f40 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20  ion so that the 
22f50 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
22f60 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68  evaluated,.** th
22f70 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f  e result is a co
22f80 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  py of the cache 
22f90 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  register..**.** 
22fa0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
22fb0 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73  used for express
22fc0 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73  ions that are us
22fd0 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20  ed multiple .** 
22fe0 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65  times.  They are
22ff0 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20   evaluated once 
23000 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20  and the results 
23010 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
23020 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e  n.** are reused.
23030 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23040 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65  ExprCodeAndCache
23050 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23060 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
23070 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
23080 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
23090 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  dbe;.  int iMem;
230a0 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
230b0 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  et>0 );.  assert
230c0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
230d0 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71  REGISTER );.  sq
230e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
230f0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
23100 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b  get);.  iMem = +
23110 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
23120 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23130 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74  p2(v, OP_Copy, t
23140 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20  arget, iMem);.  
23150 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70  exprToRegister(p
23160 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a  Expr, iMem);.}..
23170 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
23180 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20  ode that pushes 
23190 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65  the value of eve
231a0 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ry element of th
231b0 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
231c0 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20  ssion list into 
231d0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
231e0 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e  gisters beginnin
231f0 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  g at target..**.
23200 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
23210 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
23220 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a   evaluated..**.*
23230 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
23240 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76 65  L_DUP flag preve
23250 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74  nts the argument
23260 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20  s from being.** 
23270 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f  filled using OP_
23280 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20  SCopy.  OP_Copy 
23290 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73  must be used ins
232a0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tead..**.** The 
232b0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
232c0 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f  OR argument allo
232d0 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  ws constant argu
232e0 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66  ments to be.** f
232f0 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f  actored out into
23300 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
23310 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
23320 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20  SQLITE_ECEL_REF 
23330 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
23340 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
23350 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20  he list with.** 
23360 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78  ExprList.a[].u.x
23370 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68  .iOrderByCol>0 h
23380 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
23390 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73   evaluated and s
233a0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69  tored.** in regi
233b0 73 74 65 72 73 20 61 74 20 73 72 63 52 65 67 2c  sters at srcReg,
233c0 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75   and so the valu
233d0 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20  e can be copied 
233e0 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f 0a 69  from there..*/.i
233f0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
23400 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  deExprList(.  Pa
23410 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
23420 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
23430 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
23440 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54  t *pList,   /* T
23450 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
23460 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  st to be coded *
23470 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20  /.  int target, 
23480 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
23490 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
234a0 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67   */.  int srcReg
234b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72  ,        /* Sour
234c0 63 65 20 72 65 67 69 73 74 65 72 73 20 69 66 20  ce registers if 
234d0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20  SQLITE_ECEL_REF 
234e0 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20  */.  u8 flags   
234f0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
23500 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a  E_ECEL_* flags *
23510 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  /.){.  struct Ex
23520 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
23530 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  em;.  int i, j, 
23540 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d  n;.  u8 copyOp =
23550 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23560 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f  _ECEL_DUP) ? OP_
23570 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b  Copy : OP_SCopy;
23580 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
23590 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
235a0 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
235b0 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ;.  assert( targ
235c0 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  et>0 );.  assert
235d0 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
235e0 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20  =0 );  /* Never 
235f0 67 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74  gets this far ot
23600 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d  herwise */.  n =
23610 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
23620 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f   if( !ConstFacto
23630 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c  rOk(pParse) ) fl
23640 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45  ags &= ~SQLITE_E
23650 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f  CEL_FACTOR;.  fo
23660 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
23670 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c  , i=0; i<n; i++,
23680 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45   pItem++){.    E
23690 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74  xpr *pExpr = pIt
236a0 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69  em->pExpr;.    i
236b0 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  f( (flags & SQLI
236c0 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30 20  TE_ECEL_REF)!=0 
236d0 26 26 20 28 6a 20 3d 20 70 4c 69 73 74 2d 3e 61  && (j = pList->a
236e0 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
236f0 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  Col)>0 ){.      
23700 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23710 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73  2(v, copyOp, j+s
23720 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b  rcReg-1, target+
23730 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  i);.    }else if
23740 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
23750 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d  E_ECEL_FACTOR)!=
23760 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  0 && sqlite3Expr
23770 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
23780 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
23790 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
237a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
237b0 74 61 72 67 65 74 2b 69 2c 20 30 29 3b 0a 20 20  target+i, 0);.  
237c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
237d0 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  nt inReg = sqlit
237e0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
237f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
23800 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
23810 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
23820 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20  et+i ){.        
23830 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
23840 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d       if( copyOp=
23850 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
23860 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65    && (pOp=sqlite
23870 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31  3VdbeGetOp(v, -1
23880 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  ))->opcode==OP_C
23890 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
238a0 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b  pOp->p1+pOp->p3+
238b0 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20  1==inReg.       
238c0 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70    && pOp->p2+pOp
238d0 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69  ->p3+1==target+i
238e0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
238f0 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b        pOp->p3++;
23900 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
23910 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23920 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
23930 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61  opyOp, inReg, ta
23940 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20  rget+i);.       
23950 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
23960 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
23970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
23980 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  te code for a BE
23990 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  TWEEN operator..
239a0 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45  **.**    x BETWE
239b0 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a  EN y AND z.**.**
239c0 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65 71   The above is eq
239d0 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a  uivalent to .**.
239e0 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
239f0 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69  <=z.**.** Code i
23a00 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e  t as such, takin
23a10 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65  g care to do the
23a20 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65   common subexpre
23a30 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61  ssion.** elimina
23a40 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a  tion of x..**.**
23a50 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70 61 72   The xJumpIf par
23a60 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
23a70 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a  s details:.**.**
23a80 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20 20      NULL:       
23a90 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 72              Stor
23aa0 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  e the boolean re
23ab0 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65 73 74  sult in reg[dest
23ac0 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45  ].**    sqlite3E
23ad0 78 70 72 49 66 54 72 75 65 3a 20 20 20 20 20 20  xprIfTrue:      
23ae0 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20  Jump to dest if 
23af0 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69 74  true.**    sqlit
23b00 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a 20 20  e3ExprIfFalse:  
23b10 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20     Jump to dest 
23b20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54  if false.**.** T
23b30 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70 61  he jumpIfNull pa
23b40 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72  rameter is ignor
23b50 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20 69 73  ed if xJumpIf is
23b60 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
23b70 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65   void exprCodeBe
23b80 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  tween(.  Parse *
23b90 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
23ba0 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
23bb0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
23bc0 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
23bd0 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  pr,      /* The 
23be0 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69  BETWEEN expressi
23bf0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
23c00 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ,         /* Jum
23c10 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 72  p destination or
23c20 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74 69 6f   storage locatio
23c30 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4a  n */.  void (*xJ
23c40 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78 70 72  ump)(Parse*,Expr
23c50 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20 41  *,int,int), /* A
23c60 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a 2f  ction to take */
23c70 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
23c80 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65  l    /* Take the
23c90 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54   jump if the BET
23ca0 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a  WEEN is NULL */.
23cb0 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41 6e 64  ){. Expr exprAnd
23cc0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44  ;     /* The AND
23cd0 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e   operator in  x>
23ce0 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a  =y AND x<=z  */.
23cf0 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b    Expr compLeft;
23d00 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79      /* The  x>=y
23d10 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
23d20 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a   compRight;   /*
23d30 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d   The  x<=z  term
23d40 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58   */.  Expr exprX
23d50 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20  ;       /* The  
23d60 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  x  subexpression
23d70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
23d80 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f  e1 = 0; /* Tempo
23d90 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65  rary use registe
23da0 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65 74 28  r */...  memset(
23db0 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73 69  &compLeft, 0, si
23dc0 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d  zeof(Expr));.  m
23dd0 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67 68 74  emset(&compRight
23de0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
23df0 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 78  ));.  memset(&ex
23e00 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f 66  prAnd, 0, sizeof
23e10 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73 73 65  (Expr));..  asse
23e20 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
23e30 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
23e40 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65  IsSelect) );.  e
23e50 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70  xprX = *pExpr->p
23e60 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e  Left;.  exprAnd.
23e70 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65  op = TK_AND;.  e
23e80 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26  xprAnd.pLeft = &
23e90 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  compLeft;.  expr
23ea0 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f  And.pRight = &co
23eb0 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c  mpRight;.  compL
23ec0 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a  eft.op = TK_GE;.
23ed0 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74    compLeft.pLeft
23ee0 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d   = &exprX;.  com
23ef0 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70  pLeft.pRight = p
23f00 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
23f10 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d  [0].pExpr;.  com
23f20 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c  pRight.op = TK_L
23f30 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  E;.  compRight.p
23f40 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
23f50 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68   compRight.pRigh
23f60 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
23f70 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
23f80 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
23f90 28 26 65 78 70 72 58 2c 20 65 78 70 72 43 6f 64  (&exprX, exprCod
23fa0 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  eVector(pParse, 
23fb0 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65  &exprX, &regFree
23fc0 31 29 29 3b 0a 20 20 69 66 28 20 78 4a 75 6d 70  1));.  if( xJump
23fd0 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28 70 50   ){.    xJump(pP
23fe0 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
23ff0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
24000 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24010 65 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45  exprX.flags |= E
24020 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20  P_FromJoin;.    
24030 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
24040 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 26 65  arget(pParse, &e
24050 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20  xprAnd, dest);. 
24060 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
24070 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
24080 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20  e, regFree1);.. 
24090 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75   /* Ensure adequ
240a0 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67  ate test coverag
240b0 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  e */.  testcase(
240c0 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
240d0 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
240e0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
240f0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
24100 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
24110 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
24120 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
24130 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
24140 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
24150 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
24160 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
24170 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
24180 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
24190 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
241a0 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
241b0 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
241c0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
241d0 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
241e0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
241f0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
24200 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
24210 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
24220 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
24230 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
24240 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
24250 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
24260 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
24270 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
24280 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24290 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
242a0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
242b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
242c0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
242d0 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
242e0 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
242f0 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
24300 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
24310 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  0 );.}../*.** Ge
24320 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
24330 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
24340 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
24350 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
24360 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
24370 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
24380 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
24390 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
243a0 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
243b0 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
243c0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
243d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
243e0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
243f0 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
24400 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
24410 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
24420 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
24430 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
24440 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a  flag is SQLITE_J
24450 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  UMPIFNULL..**.**
24460 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
24470 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
24480 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65  hat certain toke
24490 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b  n values (ex: TK
244a0 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20  _EQ).** are the 
244b0 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76  same as opcode v
244c0 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71  alues (ex: OP_Eq
244d0 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  ) that implement
244e0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
244f0 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  ng.** operation.
24500 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e    Special commen
24510 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64  ts in vdbe.c and
24520 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
24530 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20  wk script in.** 
24540 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73  the make process
24550 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c   cause these val
24560 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41  ues to align.  A
24570 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20  ssert()s in the 
24580 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65  code.** below ve
24590 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
245a0 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65  mbers are aligne
245b0 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  d correctly..*/.
245c0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
245d0 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
245e0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
245f0 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
24600 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
24610 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
24620 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
24630 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
24640 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
24650 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
24660 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
24670 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
24680 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
24690 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
246a0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
246b0 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20  NEVER(v==0) )   
246c0 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78    return;  /* Ex
246d0 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
246e0 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
246f0 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  r */.  if( NEVER
24700 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74  (pExpr==0) ) ret
24710 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20  urn;  /* No way 
24720 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
24730 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  */.  op = pExpr-
24740 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
24750 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
24760 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _AND: {.      in
24770 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
24780 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
24790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
247a0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
247b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
247c0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
247d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
247e0 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  d2,jumpIfNull^SQ
247f0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
24800 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24810 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
24820 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
24830 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
24840 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
24850 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
24860 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
24870 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
24880 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
24890 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
248a0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
248b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
248c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
248d0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OR: {.      test
248e0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
248f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
24900 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
24910 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
24920 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
24930 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
24940 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
24950 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
24960 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
24970 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
24980 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
24990 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
249a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
249b0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
249c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
249d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
249e0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
249f0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
24a00 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
24a10 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24a20 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
24a30 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
24a40 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
24a50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
24a60 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
24a70 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
24a80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24a90 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
24aa0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
24ab0 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
24ac0 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
24ad0 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
24ae0 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49  _NE;.      jumpI
24af0 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e  fNull = SQLITE_N
24b00 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20  ULLEQ;.      /* 
24b10 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  Fall thru */.   
24b20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
24b30 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
24b40 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
24b50 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
24b60 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
24b70 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
24b80 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
24b90 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78  ExprIsVector(pEx
24ba0 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74  pr->pLeft) ) got
24bb0 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a  o default_expr;.
24bc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24bd0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
24be0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
24bf0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
24c00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
24c10 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
24c20 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
24c30 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
24c40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
24c50 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
24c60 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
24c70 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
24c80 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
24c90 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cb0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
24cc0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
24cd0 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
24ce0 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
24cf0 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
24d00 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
24d10 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
24d20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
24d30 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
24d40 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
24d50 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
24d60 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Le);.      as
24d70 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
24d80 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
24d90 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
24da0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
24db0 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Gt);.      asse
24dc0 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
24dd0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
24de0 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
24df0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
24e00 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
24e10 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
24e20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
24e30 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Eq);.      VdbeC
24e40 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
24e50 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
24e60 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
24e70 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
24e80 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
24e90 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
24ea0 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
24eb0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73  LLEQ);.      ass
24ec0 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
24ed0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
24ee0 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64  OP_Ne);.      Vd
24ef0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
24f00 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
24f10 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
24f20 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
24f30 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
24f40 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
24f50 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
24f60 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
24f70 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
24f80 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
24f90 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
24fa0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
24fb0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
24fc0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
24fd0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
24fe0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LL: {.      asse
24ff0 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
25000 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65  P_IsNull );   te
25010 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
25020 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61  SNULL );.      a
25030 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
25040 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
25050 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
25060 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
25070 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
25080 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
25090 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
250a0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
250b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
250c0 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
250d0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64   dest);.      Vd
250e0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
250f0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
25100 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
25110 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
25120 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
25130 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
25140 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
25150 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
25160 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
25170 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
25180 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
25190 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
251a0 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
251b0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71   pExpr, dest, sq
251c0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 2c  lite3ExprIfTrue,
251d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
251e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
251f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25200 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
25210 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
25220 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
25230 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
25240 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
25250 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
25260 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75  fNull = jumpIfNu
25270 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74  ll ? dest : dest
25280 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73  IfFalse;.      s
25290 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
252a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
252b0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
252c0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
252d0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
252e0 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
252f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
25300 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
25310 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62  fFalse);.      b
25320 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
25330 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
25340 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78  {.    default_ex
25350 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20 65 78  pr:.      if( ex
25360 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
25370 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
25380 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
25390 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
253a0 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
253b0 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
253c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
253d0 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
253e0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
253f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25400 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
25410 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
25420 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
25430 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
25440 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  If, r1, dest, ju
25450 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
25460 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
25470 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  ge(v);.        t
25480 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
25490 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
254a0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
254b0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
254c0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
254d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
254e0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
254f0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
25500 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
25510 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
25520 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20  rse, regFree2); 
25530 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   .}../*.** Gener
25540 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
25550 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
25560 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
25570 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
25580 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
25590 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
255a0 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
255b0 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
255c0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
255d0 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
255e0 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
255f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
25600 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
25610 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
25620 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
25630 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
25640 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
25650 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
25660 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f  ULL or fall thro
25670 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ugh if jumpIfNul
25680 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f  l.** is 0..*/.vo
25690 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
256a0 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61  False(Parse *pPa
256b0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
256c0 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
256d0 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
256e0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
256f0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
25700 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
25710 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
25720 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
25730 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
25740 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
25750 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
25760 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
25770 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
25780 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
25790 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63  urn; /* Existenc
257a0 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
257b0 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
257c0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
257d0 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a     return;..  /*
257e0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45   The value of pE
257f0 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61  xpr->op and op a
25800 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f  re related as fo
25810 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
25820 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
25830 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20              op. 
25840 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d   **       ------
25850 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  ---          ---
25860 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20  -------.  **    
25870 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20     TK_ISNULL    
25880 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c        OP_NotNull
25890 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
258a0 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f  OTNULL         O
258b0 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  P_IsNull.  **   
258c0 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20      TK_NE       
258d0 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a         OP_Eq.  *
258e0 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20  *       TK_EQ   
258f0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65             OP_Ne
25900 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
25910 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
25920 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Le.  **       
25930 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20  TK_LE           
25940 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20     OP_Gt.  **   
25950 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20      TK_GE       
25960 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a         OP_Lt.  *
25970 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20  *       TK_LT   
25980 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65             OP_Ge
25990 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f  .  **.  ** For o
259a0 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70  ther values of p
259b0 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20  Expr->op, op is 
259c0 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e  undefined and un
259d0 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76  used..  ** The v
259e0 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20  alue of TK_ and 
259f0 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  OP_ constants ar
25a00 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20  e arranged such 
25a10 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e  that we.  ** can
25a20 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70   compute the map
25a30 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67  ping above using
25a40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
25a50 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20  xpression..  ** 
25a60 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79  Assert()s verify
25a70 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74   that the comput
25a80 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74  ation is correct
25a90 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28  ..  */.  op = ((
25aa0 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53  pExpr->op+(TK_IS
25ab0 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f  NULL&1))^1)-(TK_
25ac0 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a  ISNULL&1);..  /*
25ad0 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20   Verify correct 
25ae0 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f  alignment of TK_
25af0 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
25b00 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
25b10 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
25b20 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  ISNULL || op==OP
25b30 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  _NotNull );.  as
25b40 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
25b50 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f  =TK_NOTNULL || o
25b60 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  p==OP_IsNull );.
25b70 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
25b80 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70  >op!=TK_NE || op
25b90 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73  ==OP_Eq );.  ass
25ba0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
25bb0 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_EQ || op==OP_
25bc0 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ne );.  assert( 
25bd0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54  pExpr->op!=TK_LT
25be0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b   || op==OP_Ge );
25bf0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
25c00 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f  ->op!=TK_LE || o
25c10 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73  p==OP_Gt );.  as
25c20 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
25c30 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GT || op==OP
25c40 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Le );.  assert(
25c50 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
25c60 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29  E || op==OP_Lt )
25c70 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
25c80 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
25c90 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
25ca0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
25cb0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
25cc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25cd0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
25ce0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
25cf0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
25d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25d10 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
25d20 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
25d30 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
25d40 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
25d50 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
25d60 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
25d70 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
25d80 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
25d90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
25da0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
25db0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
25dc0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
25dd0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
25de0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
25df0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
25e00 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
25e10 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
25e20 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
25e30 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
25e40 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
25e50 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
25e60 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
25e70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
25e80 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
25e90 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
25ea0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
25eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25ec0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
25ed0 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
25ee0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
25ef0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
25f00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
25f10 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
25f20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
25f30 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
25f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25f50 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
25f60 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
25f70 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
25f80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25f90 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
25fa0 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
25fb0 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73  ISNOT:.      tes
25fc0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
25fd0 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
25fe0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
25ff0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
26000 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45  ;.      op = (pE
26010 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20  xpr->op==TK_IS) 
26020 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b  ? TK_NE : TK_EQ;
26030 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c  .      jumpIfNul
26040 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  l = SQLITE_NULLE
26050 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  Q;.      /* Fall
26060 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73   thru */.    cas
26070 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
26080 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
26090 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
260a0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
260b0 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
260c0 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
260d0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
260e0 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e  IsVector(pExpr->
260f0 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65  pLeft) ) goto de
26100 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20  fault_expr;.    
26110 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
26120 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
26130 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
26140 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
26150 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
26160 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
26170 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
26180 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
26190 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
261a0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
261b0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
261c0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
261d0 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
261e0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
26200 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
26210 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
26220 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
26230 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
26240 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
26250 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
26260 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Lt);.      asse
26270 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
26280 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
26290 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
262a0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
262b0 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
262c0 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
262d0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
262e0 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
262f0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
26300 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26310 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
26320 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
26330 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
26340 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
26350 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
26360 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
26370 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
26380 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
26390 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
263a0 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
263b0 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
263c0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
263d0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
263e0 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
263f0 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l==SQLITE_NULLEQ
26400 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26410 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
26420 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
26430 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
26440 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
26450 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
26460 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
26470 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
26480 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26490 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
264a0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
264b0 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LEQ);.      test
264c0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
264d0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
264e0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
264f0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
26500 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
26510 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
26520 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
26530 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
26540 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
26550 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26560 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
26570 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26580 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
26590 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
265a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
265b0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20  =TK_ISNULL );   
265c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
265d0 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
265e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
265f0 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
26600 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67   );  VdbeCoverag
26610 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
26620 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  TNULL);.      te
26630 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
26640 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
26650 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
26660 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
26670 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26680 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
26690 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
266a0 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
266b0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c  pExpr, dest, sql
266c0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c  ite3ExprIfFalse,
266d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
266e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
266f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26700 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
26710 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
26720 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66        if( jumpIf
26730 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
26740 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
26750 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
26760 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20   dest, dest);.  
26770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26780 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
26790 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
267a0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
267b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
267c0 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
267d0 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
267e0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
267f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
26800 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
26810 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
26820 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26830 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
26840 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65  efault: {.    de
26850 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20  fault_expr: .   
26860 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79     if( exprAlway
26870 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
26880 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26890 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
268a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
268b0 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  f( exprAlwaysTru
268c0 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
268d0 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
268e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
268f0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
26900 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
26910 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
26920 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
26930 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26940 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p3(v, OP_IfNot, 
26950 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
26960 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
26970 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
26980 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
26990 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
269a0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
269b0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
269c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
269d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
269e0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
269f0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
26a00 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
26a10 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
26a20 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
26a30 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f   regFree2);.}../
26a40 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65  *.** Like sqlite
26a50 33 45 78 70 72 49 66 46 61 6c 73 65 28 29 20 65  3ExprIfFalse() e
26a60 78 63 65 70 74 20 74 68 61 74 20 61 20 63 6f 70  xcept that a cop
26a70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78  y is made of pEx
26a80 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64  pr before.** cod
26a90 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e  e generation, an
26aa0 64 20 74 68 61 74 20 63 6f 70 79 20 69 73 20 64  d that copy is d
26ab0 65 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f 64  eleted after cod
26ac0 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68  e generation. Th
26ad0 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68  is.** ensures th
26ae0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
26af0 70 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67  pExpr is unchang
26b00 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
26b10 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 44 75  te3ExprIfFalseDu
26b20 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
26b30 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
26b40 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49  t dest,int jumpI
26b50 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65  fNull){.  sqlite
26b60 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
26b70 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70  db;.  Expr *pCop
26b80 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  y = sqlite3ExprD
26b90 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
26ba0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
26bb0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
26bc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
26bd0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43  False(pParse, pC
26be0 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  opy, dest, jumpI
26bf0 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  fNull);.  }.  sq
26c00 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
26c10 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 0a  db, pCopy);.}...
26c20 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20  /*.** Do a deep 
26c30 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77  comparison of tw
26c40 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  o expression tre
26c50 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  es.  Return 0 if
26c60 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
26c70 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70  essions are comp
26c80 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c  letely identical
26c90 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
26ca0 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a  hey differ only.
26cb0 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20  ** by a COLLATE 
26cc0 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65 20  operator at the 
26cd0 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75  top level.  Retu
26ce0 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61 72  rn 2 if there ar
26cf0 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a  e differences.**
26d00 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
26d10 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54  top-level COLLAT
26d20 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  E operator..**.*
26d30 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d  * If any subelem
26d40 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78  ent of pB has Ex
26d50 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20  pr.iTable==(-1) 
26d60 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77  then it is allow
26d70 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65  ed.** to compare
26d80 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75   equal to an equ
26d90 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20  ivalent element 
26da0 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e  in pA with Expr.
26db0 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a  iTable==iTab..**
26dc0 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65 20  .** The pA side 
26dd0 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20 54  might be using T
26de0 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66 20  K_REGISTER.  If 
26df0 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
26e00 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f   and pB is.** no
26e10 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53  t using TK_REGIS
26e20 54 45 52 20 62 75 74 20 69 73 20 6f 74 68 65 72  TER but is other
26e30 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c  wise equivalent,
26e40 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75   then still retu
26e50 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  rn 0..**.** Some
26e60 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69  times this routi
26e70 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32  ne will return 2
26e80 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f   even if the two
26e90 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
26ea0 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76  really are equiv
26eb0 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61  alent.  If we ca
26ec0 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20  nnot prove that 
26ed0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
26ee0 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  are.** identical
26ef0 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75  , we return 2 ju
26f00 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20  st to be safe.  
26f10 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
26f20 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c  ne.** returns 2,
26f30 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74   then you do not
26f40 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72   really know for
26f50 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20   certain if the 
26f60 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
26f70 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
26f80 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74    But if you get
26f90 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e   a 0 or 1 return
26fa0 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61  , then you.** ca
26fb0 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78  n be sure the ex
26fc0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
26fd0 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20  e same.  In the 
26fe0 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20  places where.** 
26ff0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
27000 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f  used, it does no
27010 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e  t hurt to get an
27020 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a   extra 2 - that.
27030 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65  ** just might re
27040 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69  sult in some sli
27050 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64  ghtly slower cod
27060 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e  e.  But returnin
27070 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63  g.** an incorrec
27080 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c  t 0 or 1 could l
27090 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63  ead to a malfunc
270a0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
270b0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
270c0 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a  Expr *pA, Expr *
270d0 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  pB, int iTab){. 
270e0 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61   u32 combinedFla
270f0 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20  gs;.  if( pA==0 
27100 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  || pB==0 ){.    
27110 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20  return pB==pA ? 
27120 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63 6f 6d  0 : 2;.  }.  com
27130 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d  binedFlags = pA-
27140 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61  >flags | pB->fla
27150 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e  gs;.  if( combin
27160 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  edFlags & EP_Int
27170 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28  Value ){.    if(
27180 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e   (pA->flags&pB->
27190 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75  flags&EP_IntValu
271a0 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69  e)!=0 && pA->u.i
271b0 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61  Value==pB->u.iVa
271c0 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  lue ){.      ret
271d0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
271e0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
271f0 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d   if( pA->op!=pB-
27200 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >op ){.    if( p
27210 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  A->op==TK_COLLAT
27220 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  E && sqlite3Expr
27230 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66  Compare(pA->pLef
27240 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32 20 29  t, pB, iTab)<2 )
27250 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
27260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27270 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pB->op==TK_COLLA
27280 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  TE && sqlite3Exp
27290 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70 42 2d  rCompare(pA, pB-
272a0 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c 32 20  >pLeft, iTab)<2 
272b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
272c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  1;.    }.    ret
272d0 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
272e0 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
272f0 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  MN && pA->op!=TK
27300 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  _AGG_COLUMN && p
27310 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  A->u.zToken ){. 
27320 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
27330 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
27340 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
27350 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  trICmp(pA->u.zTo
27360 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
27370 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b  )!=0 ) return 2;
27380 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
27390 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b  trcmp(pA->u.zTok
273a0 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  en,pB->u.zToken)
273b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
273c0 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43  urn pA->op==TK_C
273d0 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a  OLLATE ? 1 : 2;.
273e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
273f0 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
27400 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e  Distinct)!=(pB->
27410 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
27420 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  nct) ) return 2;
27430 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63  .  if( ALWAYS((c
27440 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
27450 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29  P_TokenOnly)==0)
27460 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62   ){.    if( comb
27470 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78  inedFlags & EP_x
27480 49 73 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  IsSelect ) retur
27490 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
274a0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
274b0 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70  pA->pLeft, pB->p
274c0 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65  Left, iTab) ) re
274d0 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
274e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
274f0 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  re(pA->pRight, p
27500 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29  B->pRight, iTab)
27510 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
27520 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
27530 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ListCompare(pA->
27540 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70  x.pList, pB->x.p
27550 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20 72 65  List, iTab) ) re
27560 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
27570 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64  ALWAYS((combined
27580 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63  Flags & EP_Reduc
27590 65 64 29 3d 3d 30 29 20 26 26 20 70 41 2d 3e 6f  ed)==0) && pA->o
275a0 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p!=TK_STRING ){.
275b0 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43        if( pA->iC
275c0 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75  olumn!=pB->iColu
275d0 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  mn ) return 2;. 
275e0 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61       if( pA->iTa
275f0 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20  ble!=pB->iTable 
27600 0a 20 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e  .       && (pA->
27610 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20  iTable!=iTab || 
27620 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65  NEVER(pB->iTable
27630 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20 32  >=0)) ) return 2
27640 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
27650 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
27660 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70   Compare two Exp
27670 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20  rList objects.  
27680 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 79  Return 0 if they
27690 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61   are identical a
276a0 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  nd .** non-zero 
276b0 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69  if they differ i
276c0 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
276d0 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65   If any subeleme
276e0 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70  nt of pB has Exp
276f0 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74  r.iTable==(-1) t
27700 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65  hen it is allowe
27710 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20  d.** to compare 
27720 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69  equal to an equi
27730 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69  valent element i
27740 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69  n pA with Expr.i
27750 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a  Table==iTab..**.
27760 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
27770 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e  might return non
27780 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61  -zero for equiva
27790 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20  lent ExprLists. 
277a0 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e   The.** only con
277b0 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65  sequence will be
277c0 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69   disabled optimi
277d0 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  zations.  But th
277e0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75  is routine.** mu
277f0 73 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20  st never return 
27800 30 20 69 66 20 74 68 65 20 74 77 6f 20 45 78 70  0 if the two Exp
27810 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72  rList objects ar
27820 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a  e different, or.
27830 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ** a malfunction
27840 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a   will result..**
27850 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69  .** Two NULL poi
27860 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64  nters are consid
27870 65 72 65 64 20 74 6f 20 62 65 20 74 68 65 20 73  ered to be the s
27880 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c  ame.  But a NULL
27890 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61   pointer.** alwa
278a0 79 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  ys differs from 
278b0 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74  a non-NULL point
278c0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
278d0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
278e0 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20  e(ExprList *pA, 
278f0 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e  ExprList *pB, in
27900 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69  t iTab){.  int i
27910 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26  ;.  if( pA==0 &&
27920 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pB==0 ) return 
27930 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c  0;.  if( pA==0 |
27940 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e  | pB==0 ) return
27950 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45   1;.  if( pA->nE
27960 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29  xpr!=pB->nExpr )
27970 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72   return 1;.  for
27980 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70  (i=0; i<pA->nExp
27990 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
279a0 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e  r *pExprA = pA->
279b0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
279c0 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70  Expr *pExprB = p
279d0 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  B->a[i].pExpr;. 
279e0 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e     if( pA->a[i].
279f0 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61  sortOrder!=pB->a
27a00 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20  [i].sortOrder ) 
27a10 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
27a20 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
27a30 70 61 72 65 28 70 45 78 70 72 41 2c 20 70 45 78  pare(pExprA, pEx
27a40 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74  prB, iTab) ) ret
27a50 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
27a60 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
27a70 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77  Return true if w
27a80 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20  e can prove the 
27a90 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  pE2 will always 
27aa0 62 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69  be true if pE1 i
27ab0 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75  s.** true.  Retu
27ac0 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63  rn false if we c
27ad0 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74  annot complete t
27ae0 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70  he proof or if p
27af0 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66  E2 might.** be f
27b00 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a  alse.  Examples:
27b10 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  .**.**     pE1: 
27b20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20  x==5       pE2: 
27b30 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
27b40 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
27b50 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20       pE1: x>0   
27b60 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
27b70 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
27b80 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
27b90 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20  pE1: x=21       
27ba0 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34  pE2: x=21 OR y=4
27bb0 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  3     Result: tr
27bc0 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
27bd0 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78  !=123     pE2: x
27be0 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
27bf0 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
27c00 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20      pE1: x!=?1  
27c10 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
27c20 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
27c30 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
27c40 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45  1: x IS NULL  pE
27c50 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
27c60 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73      Result: fals
27c70 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
27c80 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20  IS ?2    pE2: x 
27c90 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
27ca0 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a  euslt: false.**.
27cb0 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e  ** When comparin
27cc0 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  g TK_COLUMN node
27cd0 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e  s between pE1 an
27ce0 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61  d pE2, if pE2 ha
27cf0 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65  s.** Expr.iTable
27d00 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61  <0 then assume a
27d10 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69   table number gi
27d20 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a  ven by iTab..**.
27d30 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  ** When in doubt
27d40 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20  , return false. 
27d50 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20   Returning true 
27d60 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
27d70 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72  formance.** impr
27d80 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  ovement.  Return
27d90 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20  ing false might 
27da0 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61  cause a performa
27db0 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62  nce reduction, b
27dc0 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c  ut.** it will al
27dd0 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f  ways give the co
27de0 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64  rrect answer and
27df0 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73   is hence always
27e00 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   safe..*/.int sq
27e10 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
27e20 45 78 70 72 28 45 78 70 72 20 2a 70 45 31 2c 20  Expr(Expr *pE1, 
27e30 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69  Expr *pE2, int i
27e40 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  Tab){.  if( sqli
27e50 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
27e60 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d  E1, pE2, iTab)==
27e70 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
27e80 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32  1;.  }.  if( pE2
27e90 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26  ->op==TK_OR.   &
27ea0 26 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d  & (sqlite3ExprIm
27eb0 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70  pliesExpr(pE1, p
27ec0 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
27ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
27ee0 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
27ef0 69 65 73 45 78 70 72 28 70 45 31 2c 20 70 45 32  iesExpr(pE1, pE2
27f00 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
27f10 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
27f20 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
27f30 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  E2->op==TK_NOTNU
27f40 4c 4c 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  LL.   && sqlite3
27f50 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2d  ExprCompare(pE1-
27f60 3e 70 4c 65 66 74 2c 20 70 45 32 2d 3e 70 4c 65  >pLeft, pE2->pLe
27f70 66 74 2c 20 69 54 61 62 29 3d 3d 30 0a 20 20 20  ft, iTab)==0.   
27f80 26 26 20 28 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f  && (pE1->op!=TK_
27f90 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f  ISNULL && pE1->o
27fa0 70 21 3d 54 4b 5f 49 53 29 0a 20 20 29 7b 0a 20  p!=TK_IS).  ){. 
27fb0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
27fc0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
27fd0 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
27fe0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
27ff0 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
28000 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
28010 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65   walker.** to de
28020 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78  termine if an ex
28030 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
28040 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65 66  evaluated by ref
28050 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a  erence to the.**
28060 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74   index only, wit
28070 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64  hout having to d
28080 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 74  o a search for t
28090 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
280a0 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  .** table entry.
280b0 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70    The IdxCover.p
280c0 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68 65  Idx field is the
280d0 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65   index.  IdxCove
280e0 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65  r.iCur.** is the
280f0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
28100 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  table..*/.struct
28110 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e   IdxCover {.  In
28120 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f  dex *pIdx;     /
28130 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
28140 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76  e tested for cov
28150 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69  erage */.  int i
28160 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  Cur;        /* C
28170 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
28180 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65   the table corre
28190 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
281a0 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  index */.};../*.
281b0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
281c0 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65 66  if there are ref
281d0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
281e0 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20  ns in table .** 
281f0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
28200 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62  over->iCur can b
28210 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e  e satisfied usin
28220 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70  g the index.** p
28230 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f  Walker->u.pIdxCo
28240 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74  ver->pIdx..*/.st
28250 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64 78  atic int exprIdx
28260 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  Cover(Walker *pW
28270 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
28280 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  pr){.  if( pExpr
28290 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
282a0 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61     && pExpr->iTa
282b0 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
282c0 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a  pIdxCover->iCur.
282d0 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c     && sqlite3Col
282e0 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b  umnOfIndex(pWalk
282f0 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
28300 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43  >pIdx, pExpr->iC
28310 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20  olumn)<0.  ){.  
28320 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
28330 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
28340 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
28350 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
28360 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
28370 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  Determine if an 
28380 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61  index pIdx on ta
28390 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
283a0 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69  iCur contains wi
283b0 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  ll.** the expres
283c0 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74  sion pExpr.  Ret
283d0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
283e0 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72  index does cover
283f0 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
28400 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  on and false if 
28410 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
28420 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20  sion references 
28430 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  table columns.**
28440 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f   that are not fo
28450 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78  und in the index
28460 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20   pIdx..**.** An 
28470 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61  index covering a
28480 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61  n expression mea
28490 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ns that the expr
284a0 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a  ession can be.**
284b0 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67   evaluated using
284c0 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20   only the index 
284d0 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76 69  and without havi
284e0 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ng to lookup the
284f0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
28500 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a  g table entry..*
28510 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
28520 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28  rCoveredByIndex(
28530 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
28540 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
28550 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64  dex to be tested
28560 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
28570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28580 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
28590 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  or the correspon
285a0 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ding table */.  
285b0 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
285c0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
285d0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 75   that might be u
285e0 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65  sed for coverage
285f0 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20   */.){.  Walker 
28600 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78 43  w;.  struct IdxC
28610 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d  over xcov;.  mem
28620 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
28630 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43  f(w));.  xcov.iC
28640 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f  ur = iCur;.  xco
28650 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  v.pIdx = pIdx;. 
28660 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
28670 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b   = exprIdxCover;
28680 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72  .  w.u.pIdxCover
28690 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69   = &xcov;.  sqli
286a0 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
286b0 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e  pExpr);.  return
286c0 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f   !w.eCode;.}.../
286d0 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
286e0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
286f0 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  g structure is u
28700 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20  sed by the tree 
28710 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75  walker.** to cou
28720 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  nt references to
28730 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69   table columns i
28740 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  n the arguments 
28750 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67  of an .** aggreg
28760 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e  ate function, in
28770 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
28780 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ent the.** sqlit
28790 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72  e3FunctionThisSr
287a0 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  c() routine..*/.
287b0 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
287c0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
287d0 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74  c;   /* One part
287e0 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75  icular FROM clau
287f0 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71  se in a nested q
28800 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  uery */.  int nT
28810 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  his;       /* Nu
28820 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
28830 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
28840 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69   pSrcList */.  i
28850 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20  nt nOther;      
28860 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
28870 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
28880 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d  ns in other FROM
28890 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a   clauses */.};..
288a0 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
288b0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
288c0 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e  nces to columns.
288d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
288e0 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b  xprSrcCount(Walk
288f0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
28900 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20  r *pExpr){.  /* 
28910 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74  The NEVER() on t
28920 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69  he second term i
28930 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74 65  s because sqlite
28940 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
28950 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61  sSrc().  ** is a
28960 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66  lways called bef
28970 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  ore sqlite3ExprA
28980 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
28990 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20  () and so the.  
289a0 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61  ** TK_COLUMNs ha
289b0 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
289c0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54  converted into T
289d0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49  K_AGG_COLUMN.  I
289e0 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75  f.  ** sqlite3Fu
289f0 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
28a00 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66 66  c() is used diff
28a10 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66  erently in the f
28a20 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20  uture, the.  ** 
28a30 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65  NEVER() will nee
28a40 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e  d to be removed.
28a50 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
28a60 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
28a70 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f  | NEVER(pExpr->o
28a80 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
28a90 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
28aa0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43 6f      struct SrcCo
28ab0 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  unt *p = pWalker
28ac0 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20  ->u.pSrcCount;. 
28ad0 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
28ae0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
28af0 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20  int nSrc = pSrc 
28b00 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30  ? pSrc->nSrc : 0
28b10 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
28b20 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSrc; i++){.   
28b30 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
28b40 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d  able==pSrc->a[i]
28b50 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  .iCursor ) break
28b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28b70 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  i<nSrc ){.      
28b80 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20  p->nThis++;.    
28b90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
28ba0 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a  nOther++;.    }.
28bb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
28bc0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
28bd0 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66  .** Determine if
28be0 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75   any of the argu
28bf0 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78  ments to the pEx
28c00 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65  pr Function refe
28c10 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73  rence.** pSrcLis
28c20 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  t.  Return true 
28c30 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73  if they do.  Als
28c40 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66  o return true if
28c50 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   the function.**
28c60 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74   has no argument
28c70 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f  s or has only co
28c80 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
28c90 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
28ca0 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65  if pExpr.** refe
28cb0 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62  rences columns b
28cc0 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f  ut not columns o
28cd0 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69  f tables found i
28ce0 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69  n pSrcList..*/.i
28cf0 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  nt sqlite3Functi
28d00 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45 78  onUsesThisSrc(Ex
28d10 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69  pr *pExpr, SrcLi
28d20 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20  st *pSrcList){. 
28d30 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72   Walker w;.  str
28d40 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74  uct SrcCount cnt
28d50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
28d60 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
28d70 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73  NCTION );.  mems
28d80 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
28d90 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  (w));.  w.xExprC
28da0 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72  allback = exprSr
28db0 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70 53  cCount;.  w.u.pS
28dc0 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a  rcCount = &cnt;.
28dd0 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72    cnt.pSrc = pSr
28de0 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68  cList;.  cnt.nTh
28df0 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f  is = 0;.  cnt.nO
28e00 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ther = 0;.  sqli
28e10 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28  te3WalkExprList(
28e20 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  &w, pExpr->x.pLi
28e30 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e  st);.  return cn
28e40 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74  t.nThis>0 || cnt
28e50 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f  .nOther==0;.}../
28e60 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
28e70 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
28e80 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61  ggInfo->aCol[] a
28e90 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
28ea0 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
28eb0 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
28ec0 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
28ed0 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
28ee0 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
28ef0 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
28f00 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33  foColumn(sqlite3
28f10 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
28f20 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
28f30 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20    pInfo->aCol = 
28f40 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
28f50 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
28f60 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
28f70 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  Col,.       size
28f80 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30  of(pInfo->aCol[0
28f90 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  ]),.       &pInf
28fa0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  o->nColumn,.    
28fb0 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
28fc0 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
28fd0 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
28fe0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
28ff0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61  gInfo->aFunc[] a
29000 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
29010 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
29020 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
29030 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
29040 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
29050 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
29060 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
29070 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a  foFunc(sqlite3 *
29080 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
29090 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
290a0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73  pInfo->aFunc = s
290b0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
290c0 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20  ate(.       db, 
290d0 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
290e0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a  Func,.       siz
290f0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  eof(pInfo->aFunc
29100 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
29110 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20  nfo->nFunc,.    
29120 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
29130 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
29140 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
29150 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f  xExprCallback fo
29160 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e  r a tree walker.
29170 20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a    It is used to.
29180 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c  ** implement sql
29190 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
291a0 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65  ggregates().  Se
291b0 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
291c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a  lyzeAggregates.*
291d0 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
291e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
291f0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
29200 79 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c  yzeAggregate(Wal
29210 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
29220 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
29230 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
29240 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65  xt *pNC = pWalke
29250 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73  r->u.pNC;.  Pars
29260 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  e *pParse = pNC-
29270 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69  >pParse;.  SrcLi
29280 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
29290 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
292a0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
292b0 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66  o = pNC->pAggInf
292c0 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  o;..  switch( pE
292d0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
292e0 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
292f0 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
29300 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74  OLUMN: {.      t
29310 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
29320 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
29330 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
29340 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
29350 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
29360 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
29370 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ee if the column
29380 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68   is in one of th
29390 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
293a0 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c  FROM.      ** cl
293b0 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
293c0 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20  egate query */. 
293d0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
293e0 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a  pSrcList!=0) ){.
293f0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
29400 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
29410 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
29420 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
29430 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
29440 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
29450 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
29460 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
29470 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20   *pCol;.        
29480 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
29490 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
294a0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
294b0 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
294c0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
294d0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
294e0 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->iCursor ){.   
294f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
29500 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
29510 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
29520 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74  t pExpr refers t
29530 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  o a table.      
29540 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
29550 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
29560 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
29570 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20  gate query.  .  
29580 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
29590 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65           ** Make
295a0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
295b0 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67  e column in pAgg
295c0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20  Info->aCol[] if 
295d0 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
295e0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65    ** is not an e
295f0 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61  ntry there alrea
29600 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy..            
29610 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
29620 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
29630 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66    pCol = pAggInf
29640 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  o->aCol;.       
29650 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
29660 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
29670 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  n; k++, pCol++){
29680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
29690 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d  f( pCol->iTable=
296a0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
296b0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
296c0 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
296d0 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
296e0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
296f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29700 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29720 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41        if( (k>=pA
29730 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29  ggInfo->nColumn)
29740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
29750 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f   (k = addAggInfo
29760 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64  Column(pParse->d
29770 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30  b, pAggInfo))>=0
29780 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
29790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
297a0 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
297b0 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  >aCol[k];.      
297c0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
297d0 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
297e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
297f0 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pCol->iTable = p
29800 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
29810 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
29820 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ->iColumn = pExp
29830 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
29840 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
29850 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
29860 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
29870 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
29880 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  erColumn = -1;. 
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
298a0 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  l->pExpr = pExpr
298b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
298c0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  if( pAggInfo->pG
298d0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
298e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c            int j,
298f0 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
29900 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
29910 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  B = pAggInfo->pG
29920 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
29930 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
29940 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
29950 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20  erm = pGB->a;.  
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
29970 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pGB->nExpr;.  
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
29990 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c  r(j=0; j<n; j++,
299a0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
299b0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
299c0 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pE = pTerm->p
299d0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
299e0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
299f0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
29a00 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78   pE->iTable==pEx
29a10 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a30 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d      pE->iColumn=
29a40 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
29a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29a60 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
29a70 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  rterColumn = j;.
29a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
29ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
29ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
29ae0 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
29af0 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
29b00 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
29b10 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
29b20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72  = pAggInfo->nSor
29b30 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20  tingColumn++;.  
29b40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29b50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29b60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
29b70 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79   is now an entry
29b80 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41   for pExpr in pA
29b90 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28  ggInfo->aCol[] (
29ba0 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20  either.         
29bb0 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74     ** because it
29bc0 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72   was there befor
29bd0 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20  e or because we 
29be0 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29  just created it)
29bf0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
29c00 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78   Convert the pEx
29c10 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47  pr to be a TK_AG
29c20 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69  G_COLUMN referri
29c30 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20  ng to that.     
29c40 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e         ** pAggIn
29c50 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79  fo->aCol[] entry
29c60 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
29c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
29c80 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
29c90 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
29ca0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ce);.           
29cb0 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
29cc0 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
29cd0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
29ce0 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
29cf0 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
29d00 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
29d10 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  16)k;.          
29d20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
29d30 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
29d40 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
29d50 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
29d60 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
29d70 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
29d80 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
29d90 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
29da0 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
29db0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
29dc0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  TION: {.      if
29dd0 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  ( (pNC->ncFlags 
29de0 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d  & NC_InAggFunc)=
29df0 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57 61  =0.       && pWa
29e00 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74  lker->walkerDept
29e10 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20  h==pExpr->op2.  
29e20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
29e30 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
29e40 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70  f pExpr is a dup
29e50 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65  licate of anothe
29e60 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20  r aggregate .   
29e70 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
29e80 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79   that is already
29e90 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f   in the pAggInfo
29ea0 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20   structure.     
29eb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74     */.        st
29ec0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
29ed0 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49  c *pItem = pAggI
29ee0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20  nfo->aFunc;.    
29ef0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
29f00 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
29f10 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
29f20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
29f30 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
29f40 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45  pItem->pExpr, pE
29f50 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  xpr, -1)==0 ){. 
29f60 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
29f70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29f90 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
29fa0 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
29fb0 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
29fc0 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
29fd0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
29fe0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
29ff0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2a000 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
2a010 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
2a020 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
2a030 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
2a040 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
2a050 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
2a060 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20  if( i>=0 ){.    
2a070 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2a080 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2a090 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
2a0a0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20  lect) );.       
2a0b0 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41       pItem = &pA
2a0c0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2a0d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2a0e0 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
2a0f0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2a100 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b  pItem->iMem = ++
2a110 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2a120 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2a130 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2a140 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
2a150 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
2a160 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75        pItem->pFu
2a170 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
2a180 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
2a190 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
2a1a0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75          pExpr->u
2a1b0 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20  .zToken, .      
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2a1d0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45  pr->x.pList ? pE
2a1e0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
2a1f0 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
2a200 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2a210 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
2a220 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
2a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2a240 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2a250 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2a260 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
2a270 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2a280 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
2a290 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
2a2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a2b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2a2c0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
2a2d0 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
2a2e0 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
2a2f0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
2a300 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
2a310 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2a320 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2a330 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
2a340 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
2a350 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53  );.        ExprS
2a360 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
2a370 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
2a380 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
2a390 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b  ->iAgg = (i16)i;
2a3a0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
2a3b0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
2a3c0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nfo;.        ret
2a3d0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2a3e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a3f0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
2a400 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
2a410 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2a420 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2a430 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
2a440 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2a450 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20  InSelect(Walker 
2a460 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
2a470 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e   *pSelect){.  UN
2a480 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2a490 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45  Walker);.  UNUSE
2a4a0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c  D_PARAMETER(pSel
2a4b0 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ect);.  return W
2a4c0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2a4d0 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
2a4e0 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
2a4f0 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
2a500 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2a510 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
2a520 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
2a530 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
2a540 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
2a550 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e  that pNC->pAggIn
2a560 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e  fo.** points to.
2a570 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74    Additional ent
2a580 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e  ries are made on
2a590 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a   the AggInfo obj
2a5a0 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73  ect as.** necess
2a5b0 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
2a5c0 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
2a5d0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
2a5e0 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
2a5f0 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
2a600 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
2a610 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
2a620 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  es()..*/.void sq
2a630 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2a640 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43  Aggregates(NameC
2a650 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
2a660 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c  r *pExpr){.  Wal
2a670 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
2a680 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
2a690 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
2a6a0 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
2a6b0 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65  gregate;.  w.xSe
2a6c0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61  lectCallback = a
2a6d0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2a6e0 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e  InSelect;.  w.u.
2a6f0 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73  pNC = pNC;.  ass
2a700 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ert( pNC->pSrcLi
2a710 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  st!=0 );.  sqlit
2a720 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
2a730 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
2a740 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
2a750 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2a760 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
2a770 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
2a780 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
2a790 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
2a7a0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
2a7b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2a7c0 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
2a7d0 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
2a7e0 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20   short..*/.void 
2a7f0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2a800 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
2a810 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
2a820 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2a830 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2a840 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
2a850 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
2a860 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
2a870 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
2a880 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
2a890 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
2a8a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2a8b0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2a8c0 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
2a8d0 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2a8e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
2a8f0 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  ate a single new
2a900 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73   register for us
2a910 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69  e to hold some i
2a920 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
2a930 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lt..*/.int sqlit
2a940 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72  e3GetTempReg(Par
2a950 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
2a960 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
2a970 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Reg==0 ){.    re
2a980 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  turn ++pParse->n
2a990 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Mem;.  }.  retur
2a9a0 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  n pParse->aTempR
2a9b0 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65  eg[--pParse->nTe
2a9c0 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mpReg];.}../*.**
2a9d0 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65   Deallocate a re
2a9e0 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61  gister, making a
2a9f0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
2aa00 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
2aa10 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a  r.** purpose..**
2aa20 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
2aa30 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62  r is currently b
2aa40 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 65  eing used by the
2aa50 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74   column cache, t
2aa60 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c 6c  hen.** the deall
2aa70 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72  ocation is defer
2aa80 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f  red until the co
2aa90 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20  lumn cache line 
2aaa0 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65  that uses.** the
2aab0 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65   register become
2aac0 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  s stale..*/.void
2aad0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2aae0 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
2aaf0 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
2ab00 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70  .  if( iReg && p
2ab10 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
2ab20 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
2ab30 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
2ab40 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
2ab50 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
2ab60 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  p;.    for(i=0, 
2ab70 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
2ab80 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
2ab90 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
2aba0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
2abb0 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
2abc0 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52          p->tempR
2abd0 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  eg = 1;.        
2abe0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
2abf0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
2ac00 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
2ac10 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
2ac20 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
2ac30 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20  .** Allocate or 
2ac40 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f  deallocate a blo
2ac50 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65  ck of nReg conse
2ac60 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
2ac70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
2ac80 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  etTempRange(Pars
2ac90 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
2aca0 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  Reg){.  int i, n
2acb0 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  i = pParse->
2acc0 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d  iRangeReg;.  n =
2acd0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2ace0 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d  eg;.  if( nReg<=
2acf0 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
2ad00 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
2ad10 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  che(pParse, i, i
2ad20 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61  +n-1) );.    pPa
2ad30 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
2ad40 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
2ad50 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
2ad60 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
2ad70 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
2ad80 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
2ad90 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
2ada0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
2adb0 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
2adc0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2add0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2ade0 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
2adf0 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  eg){.  sqlite3Ex
2ae00 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
2ae10 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67  arse, iReg, nReg
2ae20 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50  );.  if( nReg>pP
2ae30 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2ae40 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
2ae50 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b  RangeReg = nReg;
2ae60 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
2ae70 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ngeReg = iReg;. 
2ae80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b   }.}../*.** Mark
2ae90 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72   all temporary r
2aea0 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69 6e  egisters as bein
2aeb0 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f  g unavailable fo
2aec0 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64  r reuse..*/.void
2aed0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
2aee0 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65 20  pRegCache(Parse 
2aef0 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72  *pParse){.  pPar
2af00 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30  se->nTempReg = 0
2af10 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  ;.  pParse->nRan
2af20 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  geReg = 0;.}../*
2af30 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68 61  .** Validate tha
2af40 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20 72  t no temporary r
2af50 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77 69  egister falls wi
2af60 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f  thin the range o
2af70 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61  f.** iFirst..iLa
2af80 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20  st, inclusive.  
2af90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2afa0 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77  only call from w
2afb0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a 2a  ithin assert().*
2afc0 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  * statements..*/
2afd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2afe0 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
2aff0 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 50  NoTempsInRange(P
2b000 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2b010 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69 4c  t iFirst, int iL
2b020 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ast){.  int i;. 
2b030 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52 61   if( pParse->nRa
2b040 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20 70  ngeReg>0.   && p
2b050 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2b060 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  +pParse->nRangeR
2b070 65 67 3c 69 4c 61 73 74 0a 20 20 20 26 26 20 70  eg<iLast.   && p
2b080 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2b090 3e 3d 69 46 69 72 73 74 0a 20 20 29 7b 0a 20 20  >=iFirst.  ){.  
2b0a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2b0b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
2b0c0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20  arse->nTempReg; 
2b0d0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
2b0e0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
2b0f0 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50 61  ]>=iFirst && pPa
2b100 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d  rse->aTempReg[i]
2b110 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  <=iLast ){.     
2b120 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
2b130 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
2b140 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2b150 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a           ITE_DEBUG */.