/ Hex Artifact Content
Login

Artifact b4db982acf30aad864a047bf7676fa85761fc55e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47    if( op==TK_AGG
07c0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
07d0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
07e0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 61  return sqlite3Ta
07f0: 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  bleColumnAffinit
0800: 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20 70  y(pExpr->pTab, p
0810: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
0820: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0830: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
0840: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
0850: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
0860: 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  s&EP_xIsSelect )
0870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
0880: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
0890: 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  (.        pExpr-
08a0: 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65 63  >pLeft->x.pSelec
08b0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  t->pEList->a[pEx
08c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
08d0: 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  pr.    );.  }.  
08e0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
08f0: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0900: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0910: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0920: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0930: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0940: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
0950: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
0960: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
0970: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78  nter to a new Ex
0980: 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20  pr node that.** 
0990: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43  implements the C
09a0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
09b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
09c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
09d0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74  ror occurs, that
09e0: 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65   fact is recorde
09f0: 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a  d in pParse->db.
0a00: 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72  ** and the pExpr
0a10: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65   parameter is re
0a20: 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64  turned unchanged
0a30: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0a40: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
0a50: 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  Token(.  Parse *
0a60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
0a70: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
0a80: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
0a90: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
0aa0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22 43     /* Add the "C
0ab0: 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20 74  OLLATE" clause t
0ac0: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
0ad0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  n */.  const Tok
0ae0: 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20  en *pCollName,  
0af0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
0b00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
0b10: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0b30: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 70  rue to dequote p
0b40: 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  CollName */.){. 
0b50: 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e   if( pCollName->
0b60: 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  n>0 ){.    Expr 
0b70: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
0b80: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
0b90: 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c  >db, TK_COLLATE,
0ba0: 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75   pCollName, dequ
0bb0: 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ote);.    if( pN
0bc0: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
0bd0: 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b  ->pLeft = pExpr;
0be0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
0bf0: 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65  gs |= EP_Collate
0c00: 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20  |EP_Skip;.      
0c10: 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
0c20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
0c30: 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a   pExpr;.}.Expr *
0c40: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0c50: 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72 73  llateString(Pars
0c60: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
0c70: 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63 68  *pExpr, const ch
0c80: 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e  ar *zC){.  Token
0c90: 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   s;.  assert( zC
0ca0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
0cb0: 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28 63  TokenInit(&s, (c
0cc0: 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75  har*)zC);.  retu
0cd0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 64  rn sqlite3ExprAd
0ce0: 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
0cf0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73 2c  arse, pExpr, &s,
0d00: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b   0);.}../*.** Sk
0d10: 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43  ip over any TK_C
0d20: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
0d30: 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c   and any unlikel
0d40: 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69  y().** or likeli
0d50: 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  hood() function 
0d60: 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  at the root of a
0d70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  n expression..*/
0d80: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
0d90: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78  prSkipCollate(Ex
0da0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 68  pr *pExpr){.  wh
0db0: 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45 78  ile( pExpr && Ex
0dc0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0dd0: 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b  xpr, EP_Skip) ){
0de0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
0df0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0e00: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0e10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
0e20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0e30: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
0e40: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ct) );.      ass
0e50: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
0e60: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
0e70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
0e80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
0e90: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45  TION );.      pE
0ea0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  xpr = pExpr->x.p
0eb0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
0ec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0ed0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0ee0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0ef0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20   );.      pExpr 
0f00: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
0f10: 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72      }.  }   .  r
0f20: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
0f30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0f40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0f50: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
0f60: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
0f70: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
0f80: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
0f90: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
0fa0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
0fb0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
0fc0: 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64  uence might be d
0fd0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43  etermined by a C
0fe0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a  OLLATE operator.
0ff0: 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72 65  ** or by the pre
1000: 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d  sence of a colum
1010: 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  n with a defined
1020: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1030: 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20  nce..** COLLATE 
1040: 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66  operators take f
1050: 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e  irst precedence.
1060: 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20    Left operands 
1070: 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e  take.** preceden
1080: 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70  ce over right op
1090: 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53  erands..*/.CollS
10a0: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
10b0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
10c0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
10d0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
10e0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10f0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1100: 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20   = 0;.  Expr *p 
1110: 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  = pExpr;.  while
1120: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  ( p ){.    int o
1130: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69  p = p->op;.    i
1140: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
1150: 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b  _Generic ) break
1160: 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b  ;.    if( op==TK
1170: 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  _CAST || op==TK_
1180: 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 70  UPLUS ){.      p
1190: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
11a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
11b0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
11c0: 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70  K_COLLATE || (op
11d0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
11e0: 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c   p->op2==TK_COLL
11f0: 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70 43  ATE) ){.      pC
1200: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
1210: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1220: 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75  ENC(db), 0, p->u
1230: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1240: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1250: 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47   if( (op==TK_AGG
1260: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
1270: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1280: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
1290: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
12a0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26 26  TRIGGER).     &&
12b0: 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20   p->pTab!=0.    
12c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d  ){.      /* op==
12d0: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
12e0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
12f0: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
1300: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
1310: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
1320: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
1330: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
1340: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
1350: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
1360: 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75  int j = p->iColu
1370: 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e  mn;.      if( j>
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
1390: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
13a0: 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  = p->pTab->aCol[
13b0: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
13c0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
13d0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
13e0: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
13f0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1410: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
1420: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
1430: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
1440: 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66 74  eft && (p->pLeft
1450: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
1460: 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  late)!=0 ){.    
1470: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
1480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1490: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
14a0: 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b  xt  = p->pRight;
14b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
14c0: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
14d0: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
14e0: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
14f0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
1500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1510: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
1520: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1530: 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61         /* p->fla
1540: 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c  gs holds EP_Coll
1550: 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74  ate and p->pLeft
1560: 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74  ->flags does not
1570: 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20 2a  .  And.        *
1580: 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63  * p->x.pSelect c
1590: 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d  annot.  So if p-
15a0: 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73 2c  >x.pLeft exists,
15b0: 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61 74   it must hold at
15c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 73  .        ** leas
15d0: 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65  t one EP_Collate
15e0: 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f  . Thus the follo
15f0: 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53 2e  wing two ALWAYS.
1600: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1610: 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26  p->x.pList!=0 &&
1620: 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61 73   ALWAYS(!ExprHas
1630: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
1640: 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20 20  IsSelect)) ){.  
1650: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
1660: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1670: 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e  ; ALWAYS(i<p->x.
1680: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69  pList->nExpr); i
1690: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
16a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16b0: 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d  erty(p->x.pList-
16c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  >a[i].pExpr, EP_
16d0: 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  Collate) ){.    
16e0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74 20            pNext 
16f0: 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  = p->x.pList->a[
1700: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1720: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1740: 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70   }.        p = p
1750: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
1770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1780: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65    if( sqlite3Che
1790: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
17a0: 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20  , pColl) ){ .   
17b0: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a   pColl = 0;.  }.
17c0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
17d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
17e0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
17f0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1800: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1810: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1820: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1830: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1840: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1850: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1860: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1870: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1880: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1890: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
18a0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
18b0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
18c0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
18d0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
18e0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
18f0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1900: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1910: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1920: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1930: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1940: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1950: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1960: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1970: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1980: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1990: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
19a0: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
19b0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
19c0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
19d0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
19e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19f0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1a10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1a20: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1a30: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1a40: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1a50: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1a60: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1a70: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1a80: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1a90: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1aa0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1ac0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ad0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ae0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1af0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1b00: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1b10: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1b20: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1b30: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1b40: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1b50: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1b60: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1b70: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1b80: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1b90: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1ba0: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1bb0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1bc0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1bd0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1be0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1bf0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1c00: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
1c10: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
1c20: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
1c30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
1c40: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1c50: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
1c60: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
1c70: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
1c80: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
1c90: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
1ca0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
1cb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1cc0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
1cd0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
1ce0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1cf0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
1d00: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
1d10: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
1d20: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1d30: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1d40: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
1d50: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
1d60: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1d70: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
1d80: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
1d90: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
1da0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1db0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1dc0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
1dd0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1de0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1df0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1e00: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
1e10: 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 61 66  lse if( NEVER(af
1e20: 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 61 66 66  f==0) ){.    aff
1e30: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
1e40: 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OB;.  }.  return
1e50: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70   aff;.}../*.** p
1e60: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
1e70: 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  ison expression,
1e80: 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49   eg. '=', '<', I
1e90: 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69  N(...) etc..** i
1ea0: 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74  dx_affinity is t
1eb0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61  he affinity of a
1ec0: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
1ed0: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a  . Return true.**
1ee0: 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69   if the index wi
1ef0: 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f  th affinity idx_
1f00: 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20  affinity may be 
1f10: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1f20: 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  t.** the compari
1f30: 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f  son in pExpr..*/
1f40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
1f50: 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72  xAffinityOk(Expr
1f60: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64   *pExpr, char id
1f70: 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63  x_affinity){.  c
1f80: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
1f90: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
1fa0: 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61  pr);.  switch( a
1fb0: 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ff ){.    case S
1fc0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a  QLITE_AFF_BLOB:.
1fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ff0: 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
2000: 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e  return idx_affin
2010: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
2020: 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75 6c  TEXT;.    defaul
2030: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
2040: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
2050: 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66  Affinity(idx_aff
2060: 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  inity);.  }.}../
2070: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2080: 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73 68  P5 value that sh
2090: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
20a0: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
20b0: 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28  ison.** opcode (
20c0: 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63  OP_Eq, OP_Ge etc
20d0: 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  .) used to compa
20e0: 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70 45  re pExpr1 and pE
20f0: 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xpr2..*/.static 
2100: 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65  u8 binaryCompare
2110: 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c  P5(Expr *pExpr1,
2120: 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69   Expr *pExpr2, i
2130: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
2140: 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61 72    u8 aff = (char
2150: 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69  )sqlite3ExprAffi
2160: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
2170: 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69 74 65  aff = (u8)sqlite
2180: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
2190: 28 70 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20  (pExpr1, aff) | 
21a0: 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a  (u8)jumpIfNull;.
21b0: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
21c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21d0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
21e0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
21f0: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2200: 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69   used by.** a bi
2210: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  nary comparison 
2220: 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69  operator compari
2230: 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  ng pLeft and pRi
2240: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ght..**.** If th
2250: 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72  e left hand expr
2260: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
2270: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
2280: 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73  type, then it is
2290: 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77  .** used. Otherw
22a0: 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ise the collatio
22b0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
22c0: 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 65 78  he right hand ex
22d0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75  pression.** is u
22e0: 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61  sed, or the defa
22f0: 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66 20  ult (BINARY) if 
2300: 6e 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69  neither expressi
2310: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
2320: 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a  ng.** type..**.*
2330: 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69 67 68  * Argument pRigh
2340: 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65 66 74  t (but not pLeft
2350: 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c 20  ) may be a null 
2360: 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68 69 73  pointer. In this
2370: 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20   case,.** it is 
2380: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  not considered..
2390: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
23a0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
23b0: 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65  CollSeq(.  Parse
23c0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70   *pParse, .  Exp
23d0: 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70  r *pLeft, .  Exp
23e0: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43  r *pRight.){.  C
23f0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
2400: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
2410: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66  ;.  if( pLeft->f
2420: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2430: 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  e ){.    pColl =
2440: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2450: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2460: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
2470: 70 52 69 67 68 74 20 26 26 20 28 70 52 69 67 68  pRight && (pRigh
2480: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
2490: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
24a0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
24b0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
24c0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  se, pRight);.  }
24d0: 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  else{.    pColl 
24e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
24f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
2500: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  ft);.    if( !pC
2510: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
2520: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2530: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2540: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
2550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
2560: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  l;.}../*.** Gene
2570: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
2580: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
2590: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
25a0: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
25b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
25d0: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
25e0: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
25f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2600: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
2610: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2620: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2630: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
2640: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2650: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
2660: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
2670: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2680: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
2690: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
26a0: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
26b0: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
26c0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
26d0: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
26e0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
26f0: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
2700: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
2710: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
2720: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
2730: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
2740: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
2750: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
2760: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
2770: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
2780: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
2790: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
27a0: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
27b0: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
27c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
27d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
27e0: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
27f0: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
2820: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
2830: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2840: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2850: 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74 75 72  (u8)p5);.  retur
2860: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
2870: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2880: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
2890: 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 6f 72   is a vector, or
28a0: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
28b0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74 6f 72  ..**.** A vector
28c0: 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20 61   is defined as a
28d0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
28e0: 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20 74 77  at results in tw
28f0: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c  o or more.** col
2900: 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74 2e 20  umns of result. 
2910: 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54 4f 52   Every TK_VECTOR
2920: 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65 63 74   node is an vect
2930: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  or because the.*
2940: 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20 6e 6f  * parser will no
2950: 74 20 67 65 6e 65 72 61 74 65 20 61 20 54 4b 5f  t generate a TK_
2960: 56 45 43 54 4f 52 20 77 69 74 68 20 66 65 77 65  VECTOR with fewe
2970: 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74 72 69  r than two entri
2980: 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54 4b 5f  es..** But a TK_
2990: 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62 65 20  SELECT might be 
29a0: 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20  either a vector 
29b0: 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49 74 20  or a scalar. It 
29c0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69  is only.** consi
29d0: 64 65 72 65 64 20 61 20 76 65 63 74 6f 72 20 69  dered a vector i
29e0: 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f 72 20  f it has two or 
29f0: 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  more result colu
2a00: 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mns..*/.int sqli
2a10: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
2a20: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2a30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
2a40: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
2a50: 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pr)>1;.}../*.** 
2a60: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
2a70: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
2a80: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73  only argument is
2a90: 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54   of type TK_VECT
2aa0: 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  OR .** return th
2ab0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 70 72  e number of expr
2ac0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 76  essions in the v
2ad0: 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20 74 68  ector. Or, if th
2ae0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
2af0: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c  is a sub-select,
2b00: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
2b10: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2b20: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
2b30: 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74 68 65   For.** any othe
2b40: 72 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73  r type of expres
2b50: 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31 2e 0a  sion, return 1..
2b60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2b70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45 78 70  prVectorSize(Exp
2b80: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 38 20  r *pExpr){.  u8 
2b90: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
2ba0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
2bb0: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 45 78  ISTER ) op = pEx
2bc0: 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28 20 6f  pr->op2;.  if( o
2bd0: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 7b 0a  p==TK_VECTOR ){.
2be0: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
2bf0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2c00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2c10: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
2c20: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
2c30: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
2c40: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2c50: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
2c60: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
2c70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2c80: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 52 65 74 75  QUERY./*.** Retu
2c90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2ca0: 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  a subexpression 
2cb0: 6f 66 20 70 56 65 63 74 6f 72 20 74 68 61 74 20  of pVector that 
2cc0: 69 73 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63  is the i-th.** c
2cd0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
2ce0: 74 6f 72 20 28 6e 75 6d 62 65 72 65 64 20 73 74  tor (numbered st
2cf0: 61 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20  arting with 0). 
2d00: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
2d10: 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20  .** ensure that 
2d20: 69 20 69 73 20 77 69 74 68 69 6e 20 72 61 6e 67  i is within rang
2d30: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63  e..**.** If pVec
2d40: 74 6f 72 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tor is really a 
2d50: 73 63 61 6c 61 72 20 28 61 6e 64 20 22 73 63 61  scalar (and "sca
2d60: 6c 61 72 22 20 68 65 72 65 20 69 6e 63 6c 75 64  lar" here includ
2d70: 65 73 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  es subqueries.**
2d80: 20 74 68 61 74 20 72 65 74 75 72 6e 20 61 20 73   that return a s
2d90: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74  ingle column!) t
2da0: 68 65 6e 20 72 65 74 75 72 6e 20 70 56 65 63 74  hen return pVect
2db0: 6f 72 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  or unmodified..*
2dc0: 2a 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74  *.** pVector ret
2dd0: 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f  ains ownership o
2de0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  f the returned s
2df0: 75 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  ubexpression..**
2e00: 0a 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f  .** If the vecto
2e10: 72 20 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e  r is a (SELECT .
2e20: 2e 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78 70  ..) then the exp
2e30: 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64  ression returned
2e40: 20 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20   is.** just the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74  expression for t
2e60: 68 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20  he i-th term of 
2e70: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
2e80: 61 6e 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62  and may.** not b
2e90: 65 20 72 65 61 64 79 20 66 6f 72 20 65 76 61 6c  e ready for eval
2ea0: 75 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74  uation because t
2eb0: 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  he table cursor 
2ec0: 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62  has not yet.** b
2ed0: 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a  een positioned..
2ee0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2ef0: 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
2f00: 70 72 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72  pr(Expr *pVector
2f10: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
2f20: 72 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70  rt( i<sqlite3Exp
2f30: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63  rVectorSize(pVec
2f40: 74 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71  tor) );.  if( sq
2f50: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2f60: 72 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20  r(pVector) ){.  
2f70: 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74 6f    assert( pVecto
2f80: 72 2d 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65  r->op2==0 || pVe
2f90: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  ctor->op==TK_REG
2fa0: 49 53 54 45 52 20 29 3b 0a 20 20 20 20 69 66 28  ISTER );.    if(
2fb0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
2fc0: 5f 53 45 4c 45 43 54 20 7c 7c 20 70 56 65 63 74  _SELECT || pVect
2fd0: 6f 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45  or->op2==TK_SELE
2fe0: 43 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  CT ){.      retu
2ff0: 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53  rn pVector->x.pS
3000: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
3010: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [i].pExpr;.    }
3020: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
3030: 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c  rn pVector->x.pL
3040: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
3050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3060: 75 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 23  urn pVector;.}.#
3070: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
3080: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
3090: 42 51 55 45 52 59 29 20 2a 2f 0a 0a 23 69 66 6e  BQUERY) */..#ifn
30a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30b0: 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 43  SUBQUERY./*.** C
30c0: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
30d0: 6e 20 61 20 6e 65 77 20 45 78 70 72 20 6f 62 6a  n a new Expr obj
30e0: 65 63 74 20 77 68 69 63 68 20 77 68 65 6e 20 70  ect which when p
30f0: 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73 71 6c 69  assed to.** sqli
3100: 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 77 69  te3ExprCode() wi
3110: 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 6c 6c 20  ll generate all 
3120: 6e 65 63 65 73 73 61 72 79 20 63 6f 64 65 20 74  necessary code t
3130: 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  o compute.** the
3140: 20 69 46 69 65 6c 64 2d 74 68 20 63 6f 6c 75 6d   iField-th colum
3150: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
3160: 65 78 70 72 65 73 73 69 6f 6e 20 70 56 65 63 74  expression pVect
3170: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  or..**.** It is 
3180: 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f 72 20 74  ok for pVector t
3190: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 28 61  o be a scalar (a
31a0: 73 20 6c 6f 6e 67 20 61 73 20 69 46 69 65 6c 64  s long as iField
31b0: 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e 20 74 68  ==0).  .** In th
31c0: 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  at case, this ro
31d0: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
31e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
31f0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
3200: 6c 65 72 20 6f 77 6e 73 20 74 68 65 20 72 65 74  ler owns the ret
3210: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3220: 74 20 61 6e 64 20 69 73 20 72 65 73 70 6f 6e 73  t and is respons
3230: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65 6e 73 75  ible for.** ensu
3240: 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65  ring that the re
3250: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 65 76 65  turned value eve
3260: 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65  ntually gets fre
3270: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ed..**.** The ca
3280: 6c 6c 65 72 20 72 65 74 61 69 6e 73 20 6f 77 6e  ller retains own
3290: 65 72 73 68 69 70 20 6f 66 20 70 56 65 63 74 6f  ership of pVecto
32a0: 72 2e 20 20 49 66 20 70 56 65 63 74 6f 72 20 69  r.  If pVector i
32b0: 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a  s a TK_SELECT,.*
32c0: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  * then the retur
32d0: 6e 65 64 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ned object will 
32e0: 72 65 66 65 72 65 6e 63 65 20 70 56 65 63 74 6f  reference pVecto
32f0: 72 20 61 6e 64 20 73 6f 20 70 56 65 63 74 6f 72  r and so pVector
3300: 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a 2a 2a 20   must remain.** 
3310: 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6c 69  valid for the li
3320: 66 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  fe of the return
3330: 65 64 20 6f 62 6a 65 63 74 2e 20 20 49 66 20 70  ed object.  If p
3340: 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 56  Vector is a TK_V
3350: 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61 20 73 63  ECTOR.** or a sc
3360: 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2c  alar expression,
3370: 20 74 68 65 6e 20 69 74 20 63 61 6e 20 62 65 20   then it can be 
3380: 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f 6e 20  deleted as soon 
3390: 61 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  as this routine.
33a0: 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  ** returns..**.*
33b0: 2a 20 41 20 74 72 69 63 6b 20 74 6f 20 63 61 75  * A trick to cau
33c0: 73 65 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 70  se a TK_SELECT p
33d0: 56 65 63 74 6f 72 20 74 6f 20 62 65 20 64 65 6c  Vector to be del
33e0: 65 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69  eted together wi
33f0: 74 68 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e  th.** the return
3400: 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 69  ed Expr object i
3410: 73 20 74 6f 20 61 74 74 61 63 68 20 74 68 65 20  s to attach the 
3420: 70 56 65 63 74 6f 72 20 74 6f 20 74 68 65 20 70  pVector to the p
3430: 52 69 67 68 74 20 66 69 65 6c 64 0a 2a 2a 20 6f  Right field.** o
3440: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 54  f the returned T
3450: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
3460: 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Expr object..*/.
3470: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3480: 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28  rForVectorField(
3490: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
34a0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
34b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
34c0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20  Expr *pVector,  
34d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74       /* The vect
34e0: 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20 65 78 70  or.  List of exp
34f0: 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75  ressions or a su
3500: 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e  b-SELECT */.  in
3510: 74 20 69 46 69 65 6c 64 20 20 20 20 20 20 20 20  t iField        
3520: 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75     /* Which colu
3530: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
3540: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b   to return */.){
3550: 0a 20 20 45 78 70 72 20 2a 70 52 65 74 3b 0a 20  .  Expr *pRet;. 
3560: 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70   if( pVector->op
3570: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
3580: 20 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74     assert( pVect
3590: 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  or->flags & EP_x
35a0: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
35b0: 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c 45 43 54  /* The TK_SELECT
35c0: 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6e 6f 64  _COLUMN Expr nod
35d0: 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
35e0: 20 70 4c 65 66 74 3a 20 20 20 20 20 20 20 20 20   pLeft:         
35f0: 20 20 70 56 65 63 74 6f 72 20 63 6f 6e 74 61 69    pVector contai
3600: 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43 54 0a 20  ning TK_SELECT. 
3610: 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20 20 20     ** pRight:   
3620: 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65 64 2e         not used.
3630: 20 20 42 75 74 20 72 65 63 75 72 73 69 76 65 6c    But recursivel
3640: 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  y deleted..    *
3650: 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20 20 20  * iColumn:      
3660: 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20 63 6f     Index of a co
3670: 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f 72 0a  lumn in pVector.
3680: 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69 54      ** pLeft->iT
3690: 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69 6e  able:   First in
36a0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
36b0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65  ister holding re
36c0: 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20 2a  sult, or 0.    *
36d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
36e0: 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c 74     if the result
36f0: 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d 70   is not yet comp
3700: 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uted..    **.   
3710: 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44   ** sqlite3ExprD
3720: 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69 63  elete() specific
3730: 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20 72  ally skips the r
3740: 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65 20  ecursive delete 
3750: 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 20  of.    ** pLeft 
3760: 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  on TK_SELECT_COL
3770: 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74 20  UMN nodes.  But 
3780: 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f 77  pRight is follow
3790: 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a 20  ed, so pVector. 
37a0: 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74 74     ** can be att
37b0: 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74 20  ached to pRight 
37c0: 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e 6f  to cause this no
37d0: 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65 72  de to take owner
37e0: 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20 70  ship of.    ** p
37f0: 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61 6c  Vector.  Typical
3800: 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65  ly there will be
3810: 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45 4c   multiple TK_SEL
3820: 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73  ECT_COLUMN nodes
3830: 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
3840: 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69 6e   same pLeft poin
3850: 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63 74  ter to the pVect
3860: 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e 65  or, but only one
3870: 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
3880: 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56 65  will own the pVe
3890: 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctor..    */.   
38a0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 50   pRet = sqlite3P
38b0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
38c0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20 30  SELECT_COLUMN, 0
38d0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 52  , 0);.    if( pR
38e0: 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65 74  et ){.      pRet
38f0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69 65  ->iColumn = iFie
3900: 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e  ld;.      pRet->
3910: 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72 3b  pLeft = pVector;
3920: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
3930: 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70 52  t( pRet==0 || pR
3940: 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 3b  et->iTable==0 );
3950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
3960: 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  ( pVector->op==T
3970: 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63 74  K_VECTOR ) pVect
3980: 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e  or = pVector->x.
3990: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d  pList->a[iField]
39a0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65 74  .pExpr;.    pRet
39b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
39c0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 56  p(pParse->db, pV
39d0: 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  ector, 0);.  }. 
39e0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
39f0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
3a00: 65 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  e(SQLITE_OMIT_SU
3a10: 42 51 55 45 52 59 29 20 2a 2f 0a 0a 2f 2a 0a 2a  BQUERY) */../*.*
3a20: 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20  * If expression 
3a30: 70 45 78 70 72 20 69 73 20 6f 66 20 74 79 70 65  pExpr is of type
3a40: 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65   TK_SELECT, gene
3a50: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
3a60: 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74  luate.** it. Ret
3a70: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
3a80: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3a90: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28  sult is stored (
3aa0: 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73  or, if the .** s
3ab0: 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
3ac0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
3ad0: 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73  column, the firs
3ae0: 74 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a  t in an array.**
3af0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 69 6e   of registers in
3b00: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
3b10: 74 20 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a  t is stored)..**
3b20: 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
3b30: 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  not a TK_SELECT 
3b40: 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75  expression, retu
3b50: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
3b60: 69 6e 74 20 65 78 70 72 43 6f 64 65 53 75 62 73  int exprCodeSubs
3b70: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
3b80: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
3b90: 29 7b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30  ){.  int reg = 0
3ba0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3bb0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
3bc0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
3bd0: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
3be0: 20 72 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f   reg = sqlite3Co
3bf0: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
3c00: 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
3c10: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
3c20: 65 74 75 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a  eturn reg;.}../*
3c30: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 65  .** Argument pVe
3c40: 63 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ctor points to a
3c50: 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   vector expressi
3c60: 6f 6e 20 2d 20 65 69 74 68 65 72 20 61 20 54 4b  on - either a TK
3c70: 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b  _VECTOR.** or TK
3c80: 5f 53 45 4c 45 43 54 20 74 68 61 74 20 72 65 74  _SELECT that ret
3c90: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
3ca0: 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20  ne column. This 
3cb0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
3cc0: 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
3cd0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
3ce0: 69 73 74 65 72 20 74 68 61 74 20 63 6f 6e 74 61  ister that conta
3cf0: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
3d00: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 69 46 69 65  .** element iFie
3d10: 6c 64 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  ld of the vector
3d20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74  ..**.** If pVect
3d30: 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43  or is a TK_SELEC
3d40: 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  T expression, th
3d50: 65 6e 20 63 6f 64 65 20 66 6f 72 20 69 74 20 6d  en code for it m
3d60: 75 73 74 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72  ust have .** alr
3d70: 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61  eady been genera
3d80: 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 65 78  ted using the ex
3d90: 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  prCodeSubselect(
3da0: 29 20 72 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68  ) routine. In th
3db0: 69 73 0a 2a 2a 20 63 61 73 65 20 70 61 72 61 6d  is.** case param
3dc0: 65 74 65 72 20 72 65 67 53 65 6c 65 63 74 20 73  eter regSelect s
3dd0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 66 69 72  hould be the fir
3de0: 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
3df0: 66 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 63  f registers.** c
3e00: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65  ontaining the re
3e10: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 75 62  sults of the sub
3e20: 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20  -select. .**.** 
3e30: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 6f 66  If pVector is of
3e40: 20 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c   type TK_VECTOR,
3e50: 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 74   then code for t
3e60: 68 65 20 72 65 71 75 65 73 74 65 64 20 66 69 65  he requested fie
3e70: 6c 64 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  ld.** is generat
3e80: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3e90: 20 28 2a 70 52 65 67 46 72 65 65 29 20 6d 61 79   (*pRegFree) may
3ea0: 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e   be set to the n
3eb0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65  umber of.** a te
3ec0: 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
3ed0: 20 74 6f 20 62 65 20 66 72 65 65 64 20 62 79 20   to be freed by 
3ee0: 74 68 65 20 63 61 6c 6c 65 72 20 62 65 66 6f 72  the caller befor
3ef0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
3f00: 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
3f10: 69 6e 67 2c 20 6f 75 74 70 75 74 20 70 61 72 61  ing, output para
3f20: 6d 65 74 65 72 20 28 2a 70 70 45 78 70 72 29 20  meter (*ppExpr) 
3f30: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
3f40: 74 6f 20 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f  to the.** Expr o
3f50: 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
3f60: 69 6e 67 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69  ing to element i
3f70: 45 6c 65 6d 20 6f 66 20 74 68 65 20 76 65 63 74  Elem of the vect
3f80: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
3f90: 74 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  t exprVectorRegi
3fa0: 73 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ster(.  Parse *p
3fb0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
3fc0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
3fd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
3fe0: 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20  pr *pVector,    
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4000: 20 56 65 63 74 6f 72 20 74 6f 20 65 78 74 72 61   Vector to extra
4010: 63 74 20 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20  ct element from 
4020: 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 2c  */.  int iField,
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f       /* Field to
4050: 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70 56   extract from pV
4060: 65 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ector */.  int r
4070: 65 67 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  egSelect,       
4080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4090: 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20  rst in array of 
40a0: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 45  registers */.  E
40b0: 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20  xpr **ppExpr,   
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
40d0: 2a 20 4f 55 54 3a 20 45 78 70 72 65 73 73 69 6f  * OUT: Expressio
40e0: 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  n element */.  i
40f0: 6e 74 20 2a 70 52 65 67 46 72 65 65 20 20 20 20  nt *pRegFree    
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4110: 2a 20 4f 55 54 3a 20 54 65 6d 70 20 72 65 67 69  * OUT: Temp regi
4120: 73 74 65 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a  ster to free */.
4130: 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 56 65  ){.  u8 op = pVe
4140: 63 74 6f 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65  ctor->op;.  asse
4150: 72 74 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f  rt( op==TK_VECTO
4160: 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49  R || op==TK_REGI
4170: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53  STER || op==TK_S
4180: 45 4c 45 43 54 20 29 3b 0a 20 20 69 66 28 20 6f  ELECT );.  if( o
4190: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
41a0: 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20  {.    *ppExpr = 
41b0: 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
41c0: 6c 64 53 75 62 65 78 70 72 28 70 56 65 63 74 6f  ldSubexpr(pVecto
41d0: 72 2c 20 69 46 69 65 6c 64 29 3b 0a 20 20 20 20  r, iField);.    
41e0: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e  return pVector->
41f0: 69 54 61 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20  iTable+iField;. 
4200: 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f   }.  if( op==TK_
4210: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 2a 70  SELECT ){.    *p
4220: 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d  pExpr = pVector-
4230: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
4240: 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45  st->a[iField].pE
4250: 78 70 72 3b 0a 20 20 20 20 20 72 65 74 75 72 6e  xpr;.     return
4260: 20 72 65 67 53 65 6c 65 63 74 2b 69 46 69 65 6c   regSelect+iFiel
4270: 64 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72  d;.  }.  *ppExpr
4280: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c   = pVector->x.pL
4290: 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70  ist->a[iField].p
42a0: 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 73  Expr;.  return s
42b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
42c0: 6d 70 28 70 50 61 72 73 65 2c 20 2a 70 70 45 78  mp(pParse, *ppEx
42d0: 70 72 2c 20 70 52 65 67 46 72 65 65 29 3b 0a 7d  pr, pRegFree);.}
42e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
42f0: 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  on pExpr is a co
4300: 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e  mparison between
4310: 20 74 77 6f 20 76 65 63 74 6f 72 20 76 61 6c 75   two vector valu
4320: 65 73 2e 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74  es. Compute.** t
4330: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
4340: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20   comparison (1, 
4350: 30 2c 20 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20  0, or NULL) and 
4360: 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 72 65  write that.** re
4370: 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74  sult into regist
4380: 65 72 20 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  er dest..**.** T
4390: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 73  he caller must s
43a0: 61 74 69 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f  atisfy the follo
43b0: 77 69 6e 67 20 70 72 65 63 6f 6e 64 69 74 69 6f  wing preconditio
43c0: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20  ns:.**.**    if 
43d0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
43e0: 3a 20 20 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51  :      op==TK_EQ
43f0: 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f   and p5==SQLITE_
4400: 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20  NULLEQ.**    if 
4410: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4420: 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45  NOT:   op==TK_NE
4430: 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f   and p5==SQLITE_
4440: 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68  NULLEQ.**    oth
4450: 65 72 77 69 73 65 3a 20 20 20 20 20 20 20 20 20  erwise:         
4460: 20 20 20 20 20 20 20 6f 70 3d 3d 70 45 78 70 72         op==pExpr
4470: 2d 3e 6f 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a  ->op and p5==0.*
4480: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
4490: 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28  deVectorCompare(
44a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
44b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ,        /* Code
44c0: 20 67 65 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65   generator conte
44d0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
44e0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
44f0: 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
4500: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
4510: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
4520: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
4530: 73 75 6c 74 73 20 69 6e 74 6f 20 74 68 69 73 20  sults into this 
4540: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38  register */.  u8
4550: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
4560: 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
4570: 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  n operator */.  
4580: 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20  u8 p5           
4590: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
45a0: 4e 55 4c 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a  NULLEQ or zero *
45b0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
45c0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
45d0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
45e0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
45f0: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
4600: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
4610: 69 6e 74 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69  int nLeft = sqli
4620: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
4630: 65 28 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20  e(pLeft);.  int 
4640: 69 3b 0a 20 20 69 6e 74 20 72 65 67 4c 65 66 74  i;.  int regLeft
4650: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 52   = 0;.  int regR
4660: 69 67 68 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f  ight = 0;.  u8 o
4670: 70 78 20 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61  px = op;.  int a
4680: 64 64 72 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65  ddrDone = sqlite
4690: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
46a0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4c  );..  assert( nL
46b0: 65 66 74 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  eft==sqlite3Expr
46c0: 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69 67 68  VectorSize(pRigh
46d0: 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  t) );.  assert( 
46e0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
46f0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4700: 4b 5f 4e 45 20 0a 20 20 20 20 20 20 20 7c 7c 20  K_NE .       || 
4710: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4720: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4730: 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20  K_ISNOT .       
4740: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4750: 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LT || pExpr->op
4760: 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20  ==TK_GT .       
4770: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4780: 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LE || pExpr->op
4790: 3d 3d 54 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20  ==TK_GE .  );.  
47a0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
47b0: 70 3d 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d  p==op || (pExpr-
47c0: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70  >op==TK_IS && op
47d0: 3d 3d 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20  ==TK_EQ).       
47e0: 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e       || (pExpr->
47f0: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20  op==TK_ISNOT && 
4800: 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20  op==TK_NE) );.  
4810: 61 73 73 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c  assert( p5==0 ||
4820: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
4830: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4840: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c  SQLITE_NULLEQ ||
4850: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29   pExpr->op==op )
4860: 3b 0a 0a 20 20 70 35 20 7c 3d 20 53 51 4c 49 54  ;..  p5 |= SQLIT
4870: 45 5f 53 54 4f 52 45 50 32 3b 0a 20 20 69 66 28  E_STOREP2;.  if(
4880: 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70   opx==TK_LE ) op
4890: 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28  x = TK_LT;.  if(
48a0: 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70   opx==TK_GE ) op
48b0: 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65  x = TK_GT;..  re
48c0: 67 4c 65 66 74 20 3d 20 65 78 70 72 43 6f 64 65  gLeft = exprCode
48d0: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
48e0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 72 65 67 52  , pLeft);.  regR
48f0: 69 67 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53  ight = exprCodeS
4900: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
4910: 20 70 52 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72   pRight);..  for
4920: 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65  (i=0; 1 /*Loop e
4930: 78 69 74 73 20 62 79 20 22 62 72 65 61 6b 22 2a  xits by "break"*
4940: 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  /; i++){.    int
4950: 20 72 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72   regFree1 = 0, r
4960: 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20  egFree2 = 0;.   
4970: 20 45 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20   Expr *pL, *pR; 
4980: 0a 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  .    int r1, r2;
4990: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
49a0: 30 20 26 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a  0 && i<nLeft );.
49b0: 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 73 71      if( i>0 ) sq
49c0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
49d0: 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
49e0: 72 31 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52  r1 = exprVectorR
49f0: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
4a00: 70 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66  pLeft, i, regLef
4a10: 74 2c 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65  t, &pL, &regFree
4a20: 31 29 3b 0a 20 20 20 20 72 32 20 3d 20 65 78 70  1);.    r2 = exp
4a30: 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28  rVectorRegister(
4a40: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
4a50: 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70 52  i, regRight, &pR
4a60: 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
4a70: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
4a80: 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70  arse, pL, pR, op
4a90: 78 2c 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c  x, r1, r2, dest,
4aa0: 20 70 35 29 3b 0a 20 20 20 20 74 65 73 74 63 61   p5);.    testca
4ab0: 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
4ac0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4ad0: 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
4ae0: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4af0: 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
4b00: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
4b10: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4b20: 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
4b30: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4b40: 4f 50 5f 47 74 29 3b 0a 20 20 20 20 74 65 73 74  OP_Gt);.    test
4b50: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
4b60: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4b70: 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
4b80: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
4b90: 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
4ba0: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
4bb0: 71 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  q);.    testcase
4bc0: 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
4bd0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4be0: 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71  ==OP_Ne);.    sq
4bf0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4c00: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
4c10: 72 65 65 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ree1);.    sqlit
4c20: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
4c30: 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
4c40: 32 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20  2);.    if( i>0 
4c50: 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  ) sqlite3ExprCac
4c60: 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
4c70: 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d     if( i==nLeft-
4c80: 31 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  1 ){.      break
4c90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4ca0: 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  opx==TK_EQ ){.  
4cb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4cc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
4cd0: 74 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  t, dest, addrDon
4ce0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
4cf0: 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d  (v);.      p5 |=
4d00: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
4d10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4d20: 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20 20  opx==TK_NE ){.  
4d30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4d40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
4d50: 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b  dest, addrDone);
4d60: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4d70: 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d 20 53 51  ;.      p5 |= SQ
4d80: 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20  LITE_KEEPNULL;. 
4d90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4da0: 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 4c  assert( op==TK_L
4db0: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 54 20 7c  T || op==TK_GT |
4dc0: 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 6f  | op==TK_LE || o
4dd0: 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
4de0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4df0: 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f  Op2(v, OP_ElseNo
4e00: 74 45 71 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65  tEq, 0, addrDone
4e10: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
4e20: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
4e30: 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62  K_LT);.      Vdb
4e40: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
4e50: 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20  p==TK_GT);.     
4e60: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4e70: 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20  v, op==TK_LE);. 
4e80: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
4e90: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 45  eIf(v, op==TK_GE
4ea0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  );.      if( i==
4eb0: 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78 20 3d 20  nLeft-2 ) opx = 
4ec0: 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  op;.    }.  }.  
4ed0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
4ee0: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 44  veLabel(v, addrD
4ef0: 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  one);.}..#if SQL
4f00: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
4f10: 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  TH>0./*.** Check
4f20: 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e   that argument n
4f30: 48 65 69 67 68 74 20 69 73 20 6c 65 73 73 20 74  Height is less t
4f40: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
4f50: 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65  the maximum.** e
4f60: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20  xpression depth 
4f70: 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69  allowed. If it i
4f80: 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20  s not, leave an 
4f90: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
4fa0: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69  .** pParse..*/.i
4fb0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  nt sqlite3ExprCh
4fc0: 65 63 6b 48 65 69 67 68 74 28 50 61 72 73 65 20  eckHeight(Parse 
4fd0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65  *pParse, int nHe
4fe0: 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  ight){.  int rc 
4ff0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
5000: 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50  nt mxHeight = pP
5010: 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74  arse->db->aLimit
5020: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  [SQLITE_LIMIT_EX
5030: 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28  PR_DEPTH];.  if(
5040: 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68   nHeight>mxHeigh
5050: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
5060: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5070: 20 0a 20 20 20 20 20 20 20 22 45 78 70 72 65 73   .       "Expres
5080: 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f  sion tree is too
5090: 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20   large (maximum 
50a0: 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65  depth %d)", mxHe
50b0: 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  ight.    );.    
50c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
50d0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
50e0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f  rc;.}../* The fo
50f0: 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75  llowing three fu
5100: 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f  nctions, heightO
5110: 66 45 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f  fExpr(), heightO
5120: 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61  fExprList().** a
5130: 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  nd heightOfSelec
5140: 74 28 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f  t(), are used to
5150: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d   determine the m
5160: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a  aximum height.**
5170: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
5180: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
5190: 65 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74  ed by the struct
51a0: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ure passed as th
51b0: 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d  e.** first argum
51c0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ent..**.** If th
51d0: 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  is maximum heigh
51e0: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
51f0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
5200: 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  lue pointed.** t
5210: 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74  o by pnHeight, t
5220: 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
5230: 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ter, then set *p
5240: 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a  nHeight to that.
5250: 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  ** value..*/.sta
5260: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
5270: 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69  fExpr(Expr *p, i
5280: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
5290: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66   if( p ){.    if
52a0: 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e  ( p->nHeight>*pn
52b0: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  Height ){.      
52c0: 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e  *pnHeight = p->n
52d0: 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20  Height;.    }.  
52e0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
52f0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5300: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
5310: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
5320: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
5330: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
5340: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
5350: 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f  ){.      heightO
5360: 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45  fExpr(p->a[i].pE
5370: 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  xpr, pnHeight);.
5380: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
5390: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
53a0: 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
53b0: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
53c0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
53d0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
53e0: 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68  >pWhere, pnHeigh
53f0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5400: 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Expr(p->pHaving,
5410: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5420: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5430: 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74  pLimit, pnHeight
5440: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
5450: 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20  xpr(p->pOffset, 
5460: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5470: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
5480: 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69  p->pEList, pnHei
5490: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
54a0: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  OfExprList(p->pG
54b0: 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74  roupBy, pnHeight
54c0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
54d0: 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
54e0: 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  rBy, pnHeight);.
54f0: 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65      heightOfSele
5500: 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e  ct(p->pPrior, pn
5510: 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Height);.  }.}..
5520: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
5530: 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61  pr.nHeight varia
5540: 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63  ble in the struc
5550: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61  ture passed as a
5560: 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  n .** argument. 
5570: 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  An expression wi
5580: 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20  th no children, 
5590: 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a  Expr.pList or .*
55a0: 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d  * Expr.pSelect m
55b0: 65 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67  ember has a heig
55c0: 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68  ht of 1. Any oth
55d0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  er expression.**
55e0: 20 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71   has a height eq
55f0: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
5600: 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79  um height of any
5610: 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72   other .** refer
5620: 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20  enced Expr plus 
5630: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  one..**.** Also 
5640: 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f  propagate EP_Pro
5650: 70 61 67 61 74 65 20 66 6c 61 67 73 20 75 70 20  pagate flags up 
5660: 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73  from Expr.x.pLis
5670: 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c  t to Expr.flags,
5680: 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61  .** if appropria
5690: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
56a0: 69 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74  id exprSetHeight
56b0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
56c0: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
56d0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
56e0: 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29  pLeft, &nHeight)
56f0: 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72  ;.  heightOfExpr
5700: 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65  (p->pRight, &nHe
5710: 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70  ight);.  if( Exp
5720: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5730: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
5740: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c  .    heightOfSel
5750: 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74  ect(p->x.pSelect
5760: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , &nHeight);.  }
5770: 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c  else if( p->x.pL
5780: 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ist ){.    heigh
5790: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78  tOfExprList(p->x
57a0: 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74  .pList, &nHeight
57b0: 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  );.    p->flags 
57c0: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
57d0: 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
57e0: 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73  tFlags(p->x.pLis
57f0: 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65  t);.  }.  p->nHe
5800: 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b  ight = nHeight +
5810: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   1;.}../*.** Set
5820: 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68   the Expr.nHeigh
5830: 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67  t variable using
5840: 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69 67   the exprSetHeig
5850: 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49  ht() function. I
5860: 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20  f.** the height 
5870: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
5880: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  the maximum allo
5890: 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64  wed expression d
58a0: 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  epth,.** leave a
58b0: 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
58c0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72  e..**.** Also pr
58d0: 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50  opagate all EP_P
58e0: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66  ropagate flags f
58f0: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
5900: 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70  List into.** Exp
5910: 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69  r.flags. .*/.voi
5920: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74  d sqlite3ExprSet
5930: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50  HeightAndFlags(P
5940: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
5950: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50  pr *p){.  if( pP
5960: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
5970: 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65  urn;.  exprSetHe
5980: 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74  ight(p);.  sqlit
5990: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
59a0: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
59b0: 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ight);.}../*.** 
59c0: 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  Return the maxim
59d0: 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79  um height of any
59e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
59f0: 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62   referenced.** b
5a00: 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  y the select sta
5a10: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
5a20: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f   an argument..*/
5a30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
5a40: 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c  ctExprHeight(Sel
5a50: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ect *p){.  int n
5a60: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
5a70: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20  ightOfSelect(p, 
5a80: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74  &nHeight);.  ret
5a90: 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23  urn nHeight;.}.#
5aa0: 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20  else /* ABOVE:  
5ab0: 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65  Height enforceme
5ac0: 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c  nt enabled.  BEL
5ad0: 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72  OW: Height enfor
5ae0: 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a  cement off */./*
5af0: 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c  .** Propagate al
5b00: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
5b10: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
5b20: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
5b30: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
5b40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
5b50: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
5b60: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
5b70: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
5b80: 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c  if( p && p->x.pL
5b90: 69 73 74 20 26 26 20 21 45 78 70 72 48 61 73 50  ist && !ExprHasP
5ba0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
5bb0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
5bc0: 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  p->flags |= EP_P
5bd0: 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69 74  ropagate & sqlit
5be0: 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
5bf0: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
5c00: 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53  .}.#define exprS
5c10: 65 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64  etHeight(y).#end
5c20: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
5c30: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f  _EXPR_DEPTH>0 */
5c40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5c50: 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65  tine is the core
5c60: 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45   allocator for E
5c70: 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  xpr nodes..**.**
5c80: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
5c90: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
5ca0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
5cb0: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65  inter to it.  Me
5cc0: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73  mory.** for this
5cd0: 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68   node and for th
5ce0: 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  e pToken argumen
5cf0: 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c  t is a single al
5d00: 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61  location.** obta
5d10: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
5d20: 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  3DbMalloc().  Th
5d30: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
5d40: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
5d50: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
5d60: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
5d70: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
5d80: 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  eed..**.** If de
5d90: 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74  quote is true, t
5da0: 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69  hen the token (i
5db0: 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
5dc0: 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20  dequoted..** If 
5dd0: 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65  dequote is false
5de0: 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69  , no dequoting i
5df0: 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68  s performed.  Th
5e00: 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72  e deQuote.** par
5e10: 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65  ameter is ignore
5e20: 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  d if pToken is N
5e30: 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f  ULL or if the to
5e40: 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ken does not.** 
5e50: 61 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f  appear to be quo
5e60: 74 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f  ted.  If the quo
5e70: 74 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20  tes were of the 
5e80: 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62  form "..." (doub
5e90: 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68  le-quotes).** th
5ea0: 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f  en the EP_DblQuo
5eb0: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
5ec0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
5ed0: 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  n node..**.** Sp
5ee0: 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20  ecial case:  If 
5ef0: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61  op==TK_INTEGER a
5f00: 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73  nd pToken points
5f10: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61   to a string tha
5f20: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e  t.** can be tran
5f30: 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32  slated into a 32
5f40: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68  -bit integer, th
5f50: 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20  en the token is 
5f60: 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  not.** stored in
5f70: 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74   u.zToken.  Inst
5f80: 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72  ead, the integer
5f90: 20 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74   values is writt
5fa0: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61  en.** into u.iVa
5fb0: 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49  lue and the EP_I
5fc0: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20  ntValue flag is 
5fd0: 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73  set.  No extra s
5fe0: 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c  torage.** is all
5ff0: 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
6000: 68 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20  he integer text 
6010: 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20  and the dequote 
6020: 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  flag is ignored.
6030: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
6040: 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71  3ExprAlloc(.  sq
6050: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
6060: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
6070: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
6080: 6c 6f 63 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20  locRawNN() */.  
6090: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
60a0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
60b0: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
60c0: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
60d0: 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b  Token,    /* Tok
60e0: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69  en argument.  Mi
60f0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
6100: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
6110: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
6120: 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29   to dequote */.)
6130: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
6140: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
6150: 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d  ;.  int iValue =
6160: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64   0;..  assert( d
6170: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54  b!=0 );.  if( pT
6180: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
6190: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
61a0: 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20  | pToken->z==0. 
61b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
61c0: 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b  te3GetInt32(pTok
61d0: 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d  en->z, &iValue)=
61e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  =0 ){.      nExt
61f0: 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31  ra = pToken->n+1
6200: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6210: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20  iValue>=0 );.   
6220: 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20   }.  }.  pNew = 
6230: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6240: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
6250: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
6260: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
6270: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
6280: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
6290: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28      pNew->op = (
62a0: 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  u8)op;.    pNew-
62b0: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
62c0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
62d0: 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d      if( nExtra==
62e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 ){.        pNe
62f0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
6300: 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
6310: 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
6320: 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  = iValue;.      
6330: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
6340: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
6350: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
6360: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6370: 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c   pToken->z!=0 ||
6380: 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b   pToken->n==0 );
6390: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f  .        if( pTo
63a0: 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28  ken->n ) memcpy(
63b0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  pNew->u.zToken, 
63c0: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
63d0: 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  n->n);.        p
63e0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54  New->u.zToken[pT
63f0: 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  oken->n] = 0;.  
6400: 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74        if( dequot
6410: 65 20 26 26 20 73 71 6c 69 74 65 33 49 73 71 75  e && sqlite3Isqu
6420: 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  ote(pNew->u.zTok
6430: 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  en[0]) ){.      
6440: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
6450: 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29  zToken[0]=='"' )
6460: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
6470: 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20  EP_DblQuoted;.  
6480: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
6490: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
64a0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
64b0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
64c0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
64d0: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20  XPR_DEPTH>0.    
64e0: 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20  pNew->nHeight = 
64f0: 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a  1;.#endif  .  }.
6500: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
6510: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
6520: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
6530: 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65  n node from a ze
6540: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f  ro-terminated to
6550: 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20  ken that has.** 
6560: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 71  already been deq
6570: 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  uoted..*/.Expr *
6580: 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73  sqlite3Expr(.  s
6590: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
65a0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
65b0: 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61   for sqlite3DbMa
65c0: 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20  llocZero() (may 
65d0: 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  be null) */.  in
65e0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
65f0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6600: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b  const char *zTok
6620: 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  en      /* Token
6630: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
6640: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
6650: 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a    Token x;.  x.z
6660: 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e   = zToken;.  x.n
6670: 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69   = zToken ? sqli
6680: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b  te3Strlen30(zTok
6690: 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  en) : 0;.  retur
66a0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
66b0: 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30  oc(db, op, &x, 0
66c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61  );.}../*.** Atta
66d0: 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65 66  ch subtrees pLef
66e0: 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20  t and pRight to 
66f0: 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52  the Expr node pR
6700: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52  oot..**.** If pR
6710: 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  oot==NULL that m
6720: 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f  eans that a memo
6730: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
6740: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
6750: 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73  ..** In that cas
6760: 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73 75  e, delete the su
6770: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
6780: 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64   pRight..*/.void
6790: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
67a0: 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73 71  chSubtrees(.  sq
67b0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70  lite3 *db,.  Exp
67c0: 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72  r *pRoot,.  Expr
67d0: 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20   *pLeft,.  Expr 
67e0: 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28  *pRight.){.  if(
67f0: 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20   pRoot==0 ){.   
6800: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
6810: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
6820: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6830: 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  te(db, pLeft);. 
6840: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6850: 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29  lete(db, pRight)
6860: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
6870: 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  f( pRight ){.   
6880: 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74     pRoot->pRight
6890: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
68a0: 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d   pRoot->flags |=
68b0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
68c0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20  pRight->flags;. 
68d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
68e0: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
68f0: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
6900: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66  ;.      pRoot->f
6910: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
6920: 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c  gate & pLeft->fl
6930: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  ags;.    }.    e
6940: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52 6f  xprSetHeight(pRo
6950: 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ot);.  }.}../*.*
6960: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78  * Allocate an Ex
6970: 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f  pr node which jo
6980: 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  ins as many as t
6990: 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a  wo subtrees..**.
69a0: 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  ** One or both o
69b0: 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20 63  f the subtrees c
69c0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74  an be NULL.  Ret
69d0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
69e0: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72   the new.** Expr
69f0: 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61   node.  Or, if a
6a00: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
6a10: 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e  rs, set pParse->
6a20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6a30: 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75  ,.** free the su
6a40: 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75 72  btrees and retur
6a50: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20  n NULL..*/.Expr 
6a60: 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20  *sqlite3PExpr(. 
6a70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
6a90: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
6aa0: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
6ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
6ac0: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
6ad0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
6ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
6af0: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
6b00: 45 78 70 72 20 2a 70 52 69 67 68 74 20 20 20 20  Expr *pRight    
6b10: 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
6b20: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a 20   operand */.){. 
6b30: 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20   Expr *p;.  if( 
6b40: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50  op==TK_AND && pP
6b50: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
6b60: 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76  .    /* Take adv
6b70: 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d  antage of short-
6b80: 63 69 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70  circuit false op
6b90: 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41  timization for A
6ba0: 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71  ND */.    p = sq
6bb0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
6bc0: 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20  rse->db, pLeft, 
6bd0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
6be0: 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
6bf0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
6c00: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
6c10: 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 69 66  f(Expr));.    if
6c20: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ( p ){.      mem
6c30: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
6c40: 28 45 78 70 72 29 29 3b 0a 20 20 20 20 20 20 70  (Expr));.      p
6c50: 2d 3e 6f 70 20 3d 20 6f 70 20 26 20 54 4b 46 4c  ->op = op & TKFL
6c60: 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 70 2d  G_MASK;.      p-
6c70: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
6c80: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
6c90: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
6ca0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70  pParse->db, p, p
6cb0: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
6cc0: 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20   }.  if( p ) {. 
6cd0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68     sqlite3ExprCh
6ce0: 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65  eckHeight(pParse
6cf0: 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20  , p->nHeight);. 
6d00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
6d10: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c  ../*.** Add pSel
6d20: 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72 2e  ect to the Expr.
6d30: 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64 2e  x.pSelect field.
6d40: 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20 69    Or, if pExpr i
6d50: 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64  s NULL (due.** d
6d60: 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  o a memory alloc
6d70: 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20 74  ation failure) t
6d80: 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 70  hen delete the p
6d90: 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a  Select object..*
6da0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 45  /.void sqlite3PE
6db0: 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61 72  xprAddSelect(Par
6dc0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
6dd0: 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74 20   *pExpr, Select 
6de0: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66 28  *pSelect){.  if(
6df0: 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45   pExpr ){.    pE
6e00: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d  xpr->x.pSelect =
6e10: 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45 78   pSelect;.    Ex
6e20: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
6e30: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
6e40: 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a  t|EP_Subquery);.
6e50: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
6e60: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
6e70: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
6e80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
6e90: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
6ea0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6eb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
6ec0: 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  ectDelete(pParse
6ed0: 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  ->db, pSelect);.
6ee0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66    }.}.../*.** If
6ef0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6f00: 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72  is always either
6f10: 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28   TRUE or FALSE (
6f20: 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a  respectively),.*
6f30: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e  * then return 1.
6f40: 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20    If one cannot 
6f50: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72  determine the tr
6f60: 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65  uth value of the
6f70: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
6f80: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72  t compile-time r
6f90: 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54  eturn 0..**.** T
6fa0: 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
6fb0: 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f  zation.  If is O
6fc0: 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65  K to return 0 he
6fd0: 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68  re even if.** th
6fe0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61  e expression rea
6ff0: 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61  lly is always fa
7000: 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20  lse or false (a 
7010: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e  false negative).
7020: 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20  .** But it is a 
7030: 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20  bug to return 1 
7040: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7050: 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66  n might have dif
7060: 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61  ferent.** boolea
7070: 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66  n values in diff
7080: 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e  erent circumstan
7090: 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73  ces (a false pos
70a0: 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f  itive.).**.** No
70b0: 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65  te that if the e
70c0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72  xpression is par
70d0: 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c  t of conditional
70e0: 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a   for a.** LEFT J
70f0: 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  OIN, then we can
7100: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74  not determine at
7110: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
7120: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
7130: 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61  is it true or fa
7140: 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72  lse, so always r
7150: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
7160: 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79  ic int exprAlway
7170: 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a  sTrue(Expr *p){.
7180: 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69    int v = 0;.  i
7190: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
71a0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
71b0: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
71c0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
71d0: 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76  rIsInteger(p, &v
71e0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
71f0: 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73  return v!=0;.}.s
7200: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c  tatic int exprAl
7210: 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a  waysFalse(Expr *
7220: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
7230: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
7240: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
7250: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
7260: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
7270: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
7280: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
7290: 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b  ;.  return v==0;
72a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74  .}../*.** Join t
72b0: 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75  wo expressions u
72c0: 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72  sing an AND oper
72d0: 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72  ator.  If either
72e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
72f0: 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73  * NULL, then jus
7300: 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68  t return the oth
7310: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  er expression..*
7320: 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65  *.** If one side
7330: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
7340: 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77   the AND is know
7350: 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74  n to be false, t
7360: 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f  hen instead.** o
7370: 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41  f returning an A
7380: 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a  ND expression, j
7390: 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e  ust return a con
73a0: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
73b0: 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65   with.** a value
73c0: 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78   of false..*/.Ex
73d0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41  pr *sqlite3ExprA
73e0: 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
73f0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
7400: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66  r *pRight){.  if
7410: 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20  ( pLeft==0 ){.  
7420: 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b    return pRight;
7430: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
7440: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ght==0 ){.    re
7450: 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65  turn pLeft;.  }e
7460: 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61  lse if( exprAlwa
7470: 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c  ysFalse(pLeft) |
7480: 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  | exprAlwaysFals
7490: 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  e(pRight) ){.   
74a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
74b0: 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  te(db, pLeft);. 
74c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
74d0: 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29  lete(db, pRight)
74e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
74f0: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
7500: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73  , TK_INTEGER, &s
7510: 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
7520: 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  0], 0);.  }else{
7530: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20  .    Expr *pNew 
7540: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
7550: 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30  oc(db, TK_AND, 0
7560: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7570: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
7580: 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c  ees(db, pNew, pL
7590: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
75a0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20    return pNew;. 
75b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
75c0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
75d0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
75e0: 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  a function with 
75f0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75  multiple.** argu
7600: 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ments..*/.Expr *
7610: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
7620: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
7630: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  e, ExprList *pLi
7640: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
7650: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  n){.  Expr *pNew
7660: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7670: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7680: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
7690: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
76a0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
76b0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f  TK_FUNCTION, pTo
76c0: 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ken, 1);.  if( p
76d0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
76e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
76f0: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
7700: 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20  /* Avoid memory 
7710: 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  leak when malloc
7720: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
7730: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
7740: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c  ew->x.pList = pL
7750: 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ist;.  assert( !
7760: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7770: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
7780: 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ct) );.  sqlite3
7790: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
77a0: 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e  Flags(pParse, pN
77b0: 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ew);.  return pN
77c0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
77d0: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
77e0: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
77f0: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
7800: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
7810: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
7820: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
7830: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
7840: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
7850: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
7860: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
7870: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
7880: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
7890: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
78a0: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
78b0: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
78c0: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
78d0: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
78e0: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
78f0: 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f  ot too be to avo
7900: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
7910: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
7920: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
7930: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
7940: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
7950: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
7960: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
7970: 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61  rm ":aaa", "@aaa
7980: 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65  ", or "$aaa" are
7990: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61   assigned the sa
79a0: 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20  me number.** as 
79b0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
79c0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  tance of the sam
79d0: 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20  e wildcard.  Or 
79e0: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
79f0: 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  irst.** instance
7a00: 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
7a10: 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  , the next seque
7a20: 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  ntial variable n
7a30: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
7a40: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
7a50: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
7a60: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
7a70: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
7a80: 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73  xpr, u32 n){.  s
7a90: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7aa0: 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74  rse->db;.  const
7ab0: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28   char *z;..  if(
7ac0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
7ad0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  rn;.  assert( !E
7ae0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7af0: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
7b00: 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  e|EP_Reduced|EP_
7b10: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20  TokenOnly) );.  
7b20: 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  z = pExpr->u.zTo
7b30: 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  ken;.  assert( z
7b40: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7b50: 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61 73   z[0]!=0 );.  as
7b60: 73 65 72 74 28 20 6e 3d 3d 73 71 6c 69 74 65 33  sert( n==sqlite3
7b70: 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20  Strlen30(z) );. 
7b80: 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a   if( z[1]==0 ){.
7b90: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
7ba0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e  of the form "?".
7bb0: 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78    Assign the nex
7bc0: 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  t variable numbe
7bd0: 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  r */.    assert(
7be0: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20   z[0]=='?' );.  
7bf0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
7c00: 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61   = (ynVar)(++pPa
7c10: 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65  rse->nVar);.  }e
7c20: 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61 72 20 78  lse{.    ynVar x
7c30: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
7c40: 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  '?' ){.      /* 
7c50: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
7c60: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
7c70: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
7c80: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
7c90: 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73      ** use it as
7ca0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75   the variable nu
7cb0: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36  mber */.      i6
7cc0: 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  4 i;.      int b
7cd0: 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41  Ok = 0==sqlite3A
7ce0: 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c  toi64(&z[1], &i,
7cf0: 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46   n-1, SQLITE_UTF
7d00: 38 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 79  8);.      x = (y
7d10: 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65  nVar)i;.      te
7d20: 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a  stcase( i==0 );.
7d30: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7d40: 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  i==1 );.      te
7d50: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
7d60: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
7d70: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
7d80: 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  ER]-1 );.      t
7d90: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
7da0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7db0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7dc0: 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66  BER] );.      if
7dd0: 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20  ( bOk==0 || i<1 
7de0: 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  || i>db->aLimit[
7df0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
7e00: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
7e10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7e20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7e30: 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65   "variable numbe
7e40: 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  r must be betwee
7e50: 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20  n ?1 and ?%d",. 
7e60: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61             db->a
7e70: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
7e80: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
7e90: 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ER]);.        re
7ea0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
7eb0: 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73 65      if( i>pParse
7ec0: 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ->nVar ){.      
7ed0: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
7ee0: 20 28 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d   (int)i;.      }
7ef0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7f00: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c    /* Wildcards l
7f10: 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61  ike ":aaa", "$aa
7f20: 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52  a" or "@aaa".  R
7f30: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
7f40: 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  riable.      ** 
7f50: 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 70 72  number as the pr
7f60: 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f  ior appearance o
7f70: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c  f the same name,
7f80: 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a   or if the name.
7f90: 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76        ** has nev
7fa0: 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f  er appeared befo
7fb0: 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61  re, reuse the sa
7fc0: 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  me variable numb
7fd0: 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  er.      */.    
7fe0: 20 20 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20    ynVar i;.     
7ff0: 20 66 6f 72 28 69 3d 78 3d 30 3b 20 69 3c 70 50   for(i=x=0; i<pP
8000: 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b  arse->nzVar; i++
8010: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
8020: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 20  Parse->azVar[i] 
8030: 26 26 20 73 74 72 63 6d 70 28 70 50 61 72 73 65  && strcmp(pParse
8040: 2d 3e 61 7a 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30  ->azVar[i],z)==0
8050: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 20   ){.          x 
8060: 3d 20 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20  = (ynVar)i+1;.  
8070: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8080: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8090: 0a 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20  .      if( x==0 
80a0: 29 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b  ) x = (ynVar)(++
80b0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
80c0: 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e     }.    pExpr->
80d0: 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 20  iColumn = x;.   
80e0: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
80f0: 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20 63 68  zVar ){.      ch
8100: 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20 61 20  ar **a;.      a 
8110: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
8120: 6f 63 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  oc(db, pParse->a
8130: 7a 56 61 72 2c 20 78 2a 73 69 7a 65 6f 66 28 61  zVar, x*sizeof(a
8140: 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
8150: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   a==0 ){.       
8160: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
8170: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20 2f 2a 20  locFailed ); /* 
8180: 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20 74  Error reported t
8190: 68 72 6f 75 67 68 20 6d 61 6c 6c 6f 63 46 61 69  hrough mallocFai
81a0: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  led */.        r
81b0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
81c0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56       pParse->azV
81d0: 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 6d 65  ar = a;.      me
81e0: 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d 3e  mset(&a[pParse->
81f0: 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50  nzVar], 0, (x-pP
8200: 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a  arse->nzVar)*siz
8210: 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20  eof(a[0]));.    
8220: 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20    pParse->nzVar 
8230: 3d 20 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = x;.    }.    i
8240: 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  f( pParse->azVar
8250: 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  [x-1]==0 ){.    
8260: 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b    pParse->azVar[
8270: 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62  x-1] = sqlite3Db
8280: 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e  StrNDup(db, z, n
8290: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20  );.    }.  } .  
82a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  if( pParse->nVar
82b0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
82c0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
82d0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
82e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
82f0: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
8300: 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  ny SQL variables
8310: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
8320: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
8330: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
8340: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  n tree..*/.stati
8350: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
8360: 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  E void sqlite3Ex
8370: 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74  prDeleteNN(sqlit
8380: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
8390: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
83a0: 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20   );.  /* Sanity 
83b0: 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68  check: Assert th
83c0: 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20  at the IntValue 
83d0: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  is non-negative 
83e0: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
83f0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
8400: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8410: 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d  _IntValue) || p-
8420: 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  >u.iValue>=0 );.
8430: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8440: 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48 61  BUG.  if( ExprHa
8450: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8460: 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48 61  Leaf) && !ExprHa
8470: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8480: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
8490: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 65    assert( p->pLe
84a0: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ft==0 );.    ass
84b0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
84c0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
84d0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30   p->x.pSelect==0
84e0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
84f0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
8500: 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f 6b  perty(p, (EP_Tok
8510: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29  enOnly|EP_Leaf))
8520: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45   ){.    /* The E
8530: 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e  xpr.x union is n
8540: 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65  ever used at the
8550: 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78   same time as Ex
8560: 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20  pr.pRight */.   
8570: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c   assert( p->x.pL
8580: 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ist==0 || p->pRi
8590: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
85a0: 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70 2d  ( p->pLeft && p-
85b0: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op!=TK_SELECT_C
85c0: 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33 45  OLUMN ) sqlite3E
85d0: 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  xprDeleteNN(db, 
85e0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  p->pLeft);.    s
85f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8600: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
8610: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
8620: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
8630: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
8640: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
8650: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
8660: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
8670: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8680: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8690: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
86a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
86b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
86c0: 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  y(p, EP_MemToken
86d0: 29 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  ) ) sqlite3DbFre
86e0: 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e(db, p->u.zToke
86f0: 6e 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  n);.  if( !ExprH
8700: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8710: 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  _Static) ){.    
8720: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8730: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  , p);.  }.}.void
8740: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8750: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
8760: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
8770: 70 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44  p ) sqlite3ExprD
8780: 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  eleteNN(db, p);.
8790: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
87a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
87b0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
87c0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
87d0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
87e0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
87f0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
8800: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
8810: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
8820: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
8830: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
8840: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
8850: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
8860: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
8870: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
8880: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8890: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
88a0: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
88b0: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
88c0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
88d0: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
88e0: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
88f0: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
8900: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
8910: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70  }../*.** The dup
8920: 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f  edExpr*Size() ro
8930: 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75  utines each retu
8940: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
8950: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a   bytes required.
8960: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f  ** to store a co
8970: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
8980: 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f  ion or expressio
8990: 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69  n tree.  They di
89a0: 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d  ffer in.** how m
89b0: 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  uch of the tree 
89c0: 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a  is measured..**.
89d0: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
89e0: 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20  StructSize()    
89f0: 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68   Size of only th
8a00: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
8a10: 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78   .**     dupedEx
8a20: 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20  prNodeSize()    
8a30: 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20     Size of Expr 
8a40: 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65  + space for toke
8a50: 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  n.**     dupedEx
8a60: 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20  prSize()        
8a70: 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20     Expr + token 
8a80: 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e  + subtree compon
8a90: 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ents.**.********
8aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ae0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75  ***.**.** The du
8af0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
8b00: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  e() function ret
8b10: 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20  urns two values 
8b20: 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20  OR-ed together: 
8b30: 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61   .** (1) the spa
8b40: 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
8b50: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
8b60: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c  pr structure onl
8b70: 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68  y and .** (2) th
8b80: 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74  e EP_xxx flags t
8b90: 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61  hat indicate wha
8ba0: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
8bb0: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a  size should be..
8bc0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
8bd0: 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f  lues is always o
8be0: 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
8bf0: 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a    EXPR_FULLSIZE.
8c00: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44  **      EXPR_RED
8c10: 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f  UCEDSIZE   | EP_
8c20: 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20  Reduced.**      
8c30: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
8c40: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
8c50: 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  y.**.** The size
8c60: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
8c70: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  e can be found b
8c80: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65  y masking the re
8c90: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66  turn value.** of
8ca0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
8cb0: 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66  th 0xfff.  The f
8cc0: 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  lags can be foun
8cd0: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
8ce0: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
8cf0: 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64   with EP_Reduced
8d00: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a  |EP_TokenOnly..*
8d10: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
8d20: 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  ith flags==EXPRD
8d30: 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20  UP_REDUCE, this 
8d40: 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f  routines works o
8d50: 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28  n full-size.** (
8d60: 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20  unreduced) Expr 
8d70: 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20  objects as they 
8d80: 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  or originally co
8d90: 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
8da0: 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69   parser..** Duri
8db0: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ng expression an
8dc0: 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e  alysis, extra in
8dd0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d  formation is com
8de0: 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20  puted and moved 
8df0: 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61  into.** later pa
8e00: 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20  rts of teh Expr 
8e10: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
8e20: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
8e30: 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70  n might get chop
8e40: 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68  ped.** off if th
8e50: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
8e60: 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61  reduced.  Note a
8e70: 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  lso that it does
8e80: 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20   not work to.** 
8e90: 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f  make an EXPRDUP_
8ea0: 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61  REDUCE copy of a
8eb0: 20 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73   reduced express
8ec0: 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ion.  It is only
8ed0: 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64   legal.** to red
8ee0: 75 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65  uce a pristine e
8ef0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66  xpression tree f
8f00: 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20  rom the parser. 
8f10: 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
8f20: 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45  ion.** of dupedE
8f30: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
8f40: 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65  contain multiple
8f50: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
8f60: 65 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70  ents that attemp
8f70: 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20  t.** to enforce 
8f80: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
8f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
8fa0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
8fb0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
8fc0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53  flags){.  int nS
8fd0: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ize;.  assert( f
8fe0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
8ff0: 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30  DUCE || flags==0
9000: 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20   ); /* Only one 
9010: 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77  flag value allow
9020: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
9030: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30  EXPR_FULLSIZE<=0
9040: 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74  xfff );.  assert
9050: 28 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52  ( (0xfff & (EP_R
9060: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
9070: 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66  nly))==0 );.  if
9080: 28 20 30 3d 3d 66 6c 61 67 73 20 29 7b 0a 20 20  ( 0==flags ){.  
9090: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46    nSize = EXPR_F
90a0: 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65  ULLSIZE;.  }else
90b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  {.    assert( !E
90c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
90d0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
90e0: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
90f0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
9100: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9110: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20  _FromJoin) ); . 
9120: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9130: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9140: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20  P_MemToken) );. 
9150: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9160: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9170: 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20  P_NoReduce) );. 
9180: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
9190: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
91a0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
91b0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
91c0: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
91d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
91e0: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
91f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69  ==0 );.      nSi
9200: 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  ze = EXPR_TOKENO
9210: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
9220: 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20  enOnly;.    }.  
9230: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65  }.  return nSize
9240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9250: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
9260: 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79   the space in by
9270: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
9280: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a  store the copy .
9290: 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  ** of the Expr s
92a0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63  tructure and a c
92b0: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e  opy of the Expr.
92c0: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
92d0: 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69  (if that.** stri
92e0: 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a  ng is defined.).
92f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
9300: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
9310: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
9320: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
9330: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
9340: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
9350: 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20   & 0xfff;.  if( 
9360: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
9370: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
9380: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
9390: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  ){.    nByte += 
93a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
93b0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a  p->u.zToken)+1;.
93c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55    }.  return ROU
93d0: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  ND8(nByte);.}../
93e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
93f0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9400: 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
9410: 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  te a duplicate o
9420: 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73  f the .** expres
9430: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
9440: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
9450: 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  t. The second ar
9460: 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d  gument is a.** m
9470: 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45  ask containing E
9480: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
9490: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
94a0: 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  e returned inclu
94b0: 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65  des space to cre
94c0: 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
94d0: 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a  e Expr struct.**
94e0: 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20   itself and the 
94f0: 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20  buffer referred 
9500: 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f  to by Expr.u.zTo
9510: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  ken, if any..**.
9520: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
9530: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
9540: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
9550: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c  eturn value incl
9560: 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74  udes .** space t
9570: 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20  o duplicate all 
9580: 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68  Expr nodes in th
9590: 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79  e tree formed by
95a0: 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20   Expr.pLeft .** 
95b0: 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20  and Expr.pRight 
95c0: 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e  variables (but n
95d0: 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63  ot for any struc
95e0: 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tures pointed to
95f0: 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65   or .** descende
9600: 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  d from the Expr.
9610: 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e  x.pList or Expr.
9620: 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62  x.pSelect variab
9630: 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  les)..*/.static 
9640: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a  int dupedExprSiz
9650: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
9660: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
9670: 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  te = 0;.  if( p 
9680: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64  ){.    nByte = d
9690: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
96a0: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
96b0: 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55  if( flags&EXPRDU
96c0: 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  P_REDUCE ){.    
96d0: 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64    nByte += duped
96e0: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66  ExprSize(p->pLef
96f0: 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65  t, flags) + dupe
9700: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69  dExprSize(p->pRi
9710: 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ght, flags);.   
9720: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9730: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
9740: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
9750: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
9760: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
9770: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
9780: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
9790: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
97a0: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
97b0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
97c0: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
97d0: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
97e0: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
97f0: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
9800: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
9810: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
9820: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
9830: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
9840: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
9850: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
9860: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
9870: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
9880: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
9890: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
98a0: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72   past the.** por
98b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
98c0: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
98d0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
98e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
98f0: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
9900: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
9910: 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20  nt dupFlags, u8 
9920: 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45  **pzBuffer){.  E
9930: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
9940: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
9950: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20   return */.  u8 
9960: 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  *zAlloc;        
9970: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61     /* Memory spa
9980: 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  ce from which to
9990: 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65   build Expr obje
99a0: 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74  ct */.  u32 stat
99b0: 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  icFlag;       /*
99c0: 20 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70   EP_Static if sp
99d0: 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64  ace not obtained
99e0: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a   from malloc */.
99f0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
9a00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20   );.  assert( p 
9a10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70  );.  assert( dup
9a20: 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46  Flags==0 || dupF
9a30: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
9a40: 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74  DUCE );.  assert
9a50: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
9a60: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
9a70: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20  UP_REDUCE );..  
9a80: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
9a90: 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
9aa0: 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74   new Expr struct
9ab0: 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a  ure. */.  if( pz
9ac0: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41  Buffer ){.    zA
9ad0: 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72  lloc = *pzBuffer
9ae0: 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67  ;.    staticFlag
9af0: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
9b00: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f  }else{.    zAllo
9b10: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
9b20: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70  locRawNN(db, dup
9b30: 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75  edExprSize(p, du
9b40: 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74  pFlags));.    st
9b50: 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20  aticFlag = 0;.  
9b60: 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72  }.  pNew = (Expr
9b70: 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66   *)zAlloc;..  if
9b80: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a  ( pNew ){.    /*
9b90: 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f   Set nNewSize to
9ba0: 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61   the size alloca
9bb0: 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75  ted for the stru
9bc0: 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
9bd0: 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e  .    ** by pNew.
9be0: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
9bf0: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
9c00: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
9c10: 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54  or.    ** EXPR_T
9c20: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54  OKENONLYSIZE. nT
9c30: 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
9c40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
9c50: 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20  es consumed.    
9c60: 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f  ** by the copy o
9c70: 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65  f the p->u.zToke
9c80: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79  n string (if any
9c90: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f  )..    */.    co
9ca0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74  nst unsigned nSt
9cb0: 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64  ructSize = duped
9cc0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
9cd0: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
9ce0: 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53   const int nNewS
9cf0: 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a  ize = nStructSiz
9d00: 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69  e & 0xfff;.    i
9d10: 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69  nt nToken;.    i
9d20: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
9d30: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
9d40: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
9d50: 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b  en ){.      nTok
9d60: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
9d70: 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  en30(p->u.zToken
9d80: 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  ) + 1;.    }else
9d90: 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d  {.      nToken =
9da0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
9db0: 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20  ( dupFlags ){.  
9dc0: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
9dd0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9de0: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
9df0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41  .      memcpy(zA
9e00: 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a  lloc, p, nNewSiz
9e10: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9e20: 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d       u32 nSize =
9e30: 20 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74   (u32)exprStruct
9e40: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d  Size(p);.      m
9e50: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
9e60: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69   nSize);.      i
9e70: 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55  f( nSize<EXPR_FU
9e80: 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20  LLSIZE ){ .     
9e90: 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f     memset(&zAllo
9ea0: 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50  c[nSize], 0, EXP
9eb0: 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65  R_FULLSIZE-nSize
9ec0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9ed0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
9ee0: 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f   EP_Reduced, EP_
9ef0: 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45  TokenOnly, and E
9f00: 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61  P_Static flags a
9f10: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f  ppropriately. */
9f20: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
9f30: 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64   &= ~(EP_Reduced
9f40: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  |EP_TokenOnly|EP
9f50: 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f  _Static|EP_MemTo
9f60: 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ken);.    pNew->
9f70: 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74  flags |= nStruct
9f80: 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63  Size & (EP_Reduc
9f90: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
9fa0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  ;.    pNew->flag
9fb0: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
9fc0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
9fd0: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
9fe0: 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ring, if any. */
9ff0: 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20  .    if( nToken 
a000: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
a010: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
a020: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
a030: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
a040: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
a050: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
a060: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
a070: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d    }..    if( 0==
a080: 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d  ((p->flags|pNew-
a090: 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f  >flags) & (EP_To
a0a0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
a0b0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
a0c0: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
a0d0: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
a0e0: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
a0f0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
a100: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a110: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
a120: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a130: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
a140: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a150: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
a160: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a180: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
a190: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a1a0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
a1b0: 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  st, dupFlags);. 
a1c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a1d0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
a1e0: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
a1f0: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
a200: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a210: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
a220: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a230: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  nly) ){.      zA
a240: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a250: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a260: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a270: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a280: 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65  ty(pNew, EP_Toke
a290: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a2a0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a2b0: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a2c0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a2d0: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a2e0: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a2f0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a300: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a310: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a320: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a340: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a350: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a360: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a370: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a380: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a    }.      if( pz
a390: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
a3a0: 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41    *pzBuffer = zA
a3b0: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lloc;.      }.  
a3c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
a3d0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a3e0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
a3f0: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
a400: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
a410: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
a420: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
a430: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
a440: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
a450: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a460: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
a470: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
a480: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
a490: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
a4a0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
a4b0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
a4c0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  Dup(db, p->pRigh
a4d0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
a4e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a4f0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
a500: 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74 75   Create and retu
a510: 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f  rn a deep copy o
a520: 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73  f the object pas
a530: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
a540: 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  d .** argument. 
a550: 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  If an OOM condit
a560: 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ion is encounter
a570: 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
a580: 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  rned.** and the 
a590: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a5a0: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69   flag set..*/.#i
a5b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a5c0: 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69 74  T_CTE.static Wit
a5d0: 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74  h *withDup(sqlit
a5e0: 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29  e3 *db, With *p)
a5f0: 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d  {.  With *pRet =
a600: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
a610: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
a620: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65  izeof(*p) + size
a630: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
a640: 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70  ->nCte-1);.    p
a650: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
a660: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
a670: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
a680: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
a690: 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  i;.      pRet->n
a6a0: 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20  Cte = p->nCte;. 
a6b0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
a6c0: 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  p->nCte; i++){. 
a6d0: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
a6e0: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
a6f0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
a700: 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74   p->a[i].pSelect
a710: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
a720: 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d  et->a[i].pCols =
a730: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a740: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
a750: 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20  pCols, 0);.     
a760: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e     pRet->a[i].zN
a770: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
a780: 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  trDup(db, p->a[i
a790: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
a7a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
a7b0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
a7c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68  se.# define with
a7d0: 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  Dup(x,y) 0.#endi
a7e0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
a7f0: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
a800: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
a810: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
a820: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
a830: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
a840: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
a850: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
a860: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
a870: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
a880: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
a890: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
a8a0: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
a8b0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
a8c0: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
a8d0: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
a8e0: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
a8f0: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
a900: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
a910: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
a920: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
a930: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
a940: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
a950: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
a960: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
a970: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
a980: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
a990: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
a9a0: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
a9b0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
a9c0: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
a9d0: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
a9e0: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
a9f0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
aa00: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
aa10: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69  contains a combi
aa20: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  nation of the EX
aa30: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
aa40: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
aa50: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
aa60: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
aa70: 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
aa80: 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63  ed is a.** trunc
aa90: 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
aaa0: 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73  the usual Expr s
aab0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
aac0: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
aad0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ** part of the i
aae0: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
aaf0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
ab00: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
ab10: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
ab20: 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  ExprDup(sqlite3 
ab30: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
ab40: 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65  t flags){.  asse
ab50: 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
ab60: 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  flags==EXPRDUP_R
ab70: 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72  EDUCE );.  retur
ab80: 6e 20 70 20 3f 20 65 78 70 72 44 75 70 28 64 62  n p ? exprDup(db
ab90: 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a  , p, flags, 0) :
aba0: 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a   0;.}.ExprList *
abb0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
abc0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
abd0: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
abe0: 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c   flags){.  ExprL
abf0: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72  ist *pNew;.  str
ac00: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
ac10: 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49  m *pItem, *pOldI
ac20: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
ac30: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
ac40: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
ac50: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
ac60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
ac70: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
ac80: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
ac90: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
aca0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78  n 0;.  pNew->nEx
acb0: 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70  pr = i = p->nExp
acc0: 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  r;.  if( (flags 
acd0: 26 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  & EXPRDUP_REDUCE
ace0: 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b 20  )==0 ) for(i=1; 
acf0: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69  i<p->nExpr; i+=i
ad00: 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  ){}.  pNew->a = 
ad10: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44  pItem = sqlite3D
ad20: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
ad30: 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b    i*sizeof(p->a[
ad40: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
ad50: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
ad60: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
ad70: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
ad80: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
ad90: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
ada0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
adb0: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
adc0: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
add0: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
ade0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
adf0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
ae00: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
ae10: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
ae20: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
ae30: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
ae40: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ae50: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
ae60: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
ae70: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
ae80: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
ae90: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
aea0: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64    pItem->sortOrd
aeb0: 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  er = pOldItem->s
aec0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
aed0: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
aee0: 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49     pItem->bSpanI
aef0: 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  sTab = pOldItem-
af00: 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20  >bSpanIsTab;.   
af10: 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64   pItem->u = pOld
af20: 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72  Item->u;.  }.  r
af30: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
af40: 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c  *.** If cursors,
af50: 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73   triggers, views
af60: 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
af70: 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20  are all omitted 
af80: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c  from.** the buil
af90: 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20  d, then none of 
afa0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
afb0: 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66  utines, except f
afc0: 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65  or .** sqlite3Se
afd0: 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62  lectDup(), can b
afe0: 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65  e called. sqlite
aff0: 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20  3SelectDup() is 
b000: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c  sometimes.** cal
b010: 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  led with a NULL 
b020: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
b030: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b040: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
b050: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b060: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20  MIT_TRIGGER) \. 
b070: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
b080: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b090: 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  ).SrcList *sqlit
b0a0: 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c  e3SrcListDup(sql
b0b0: 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
b0c0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
b0d0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  {.  SrcList *pNe
b0e0: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  w;.  int i;.  in
b0f0: 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72  t nByte;.  asser
b100: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
b110: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
b120: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
b130: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
b140: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
b150: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
b160: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
b170: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
b180: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79  locRawNN(db, nBy
b190: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
b1a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b1b0: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
b1c0: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
b1d0: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
b1e0: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
b1f0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
b200: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
b210: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
b220: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
b230: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
b240: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
b250: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
b260: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
b270: 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49  >pSchema = pOldI
b280: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  tem->pSchema;.  
b290: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74    pNewItem->zDat
b2a0: 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44  abase = sqlite3D
b2b0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
b2c0: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
b2d0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b2e0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
b2f0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
b300: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
b310: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69    pNewItem->zAli
b320: 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  as = sqlite3DbSt
b330: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b340: 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
b350: 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70  pNewItem->fg = p
b360: 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20  OldItem->fg;.   
b370: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73   pNewItem->iCurs
b380: 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  or = pOldItem->i
b390: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77  Cursor;.    pNew
b3a0: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
b3b0: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64  b = pOldItem->ad
b3c0: 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70  drFillSub;.    p
b3d0: 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  NewItem->regRetu
b3e0: 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72  rn = pOldItem->r
b3f0: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  egReturn;.    if
b400: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69  ( pNewItem->fg.i
b410: 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20  sIndexedBy ){.  
b420: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
b430: 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71  .zIndexedBy = sq
b440: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b450: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a  , pOldItem->u1.z
b460: 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
b470: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
b480: 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49  pIBIndex = pOldI
b490: 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20  tem->pIBIndex;. 
b4a0: 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d     if( pNewItem-
b4b0: 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
b4c0: 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  .      pNewItem-
b4d0: 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a  >u1.pFuncArg = .
b4e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b4f0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
b500: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46   pOldItem->u1.pF
b510: 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a  uncArg, flags);.
b520: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
b530: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
b540: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
b550: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
b560: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
b570: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
b580: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
b590: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
b5a0: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
b5b0: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
b5c0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
b5d0: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
b5e0: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
b5f0: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
b600: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b610: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
b620: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
b630: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
b640: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
b650: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
b660: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
b670: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
b680: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
b690: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
b6a0: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
b6b0: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
b6c0: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  w;.  int i;.  as
b6d0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
b6e0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b6f0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
b700: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b710: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
b720: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
b730: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
b740: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
b750: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
b760: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
b770: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d  llocRawNN(db, p-
b780: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
b790: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
b7a0: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
b7b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b7c0: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  , pNew);.    ret
b7d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
b7e0: 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61 75 73  Note that becaus
b7f0: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
b800: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72  e allocation for
b810: 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20   p->a[] is not. 
b820: 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20   ** necessarily 
b830: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20  a power of two, 
b840: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
b850: 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65  end() may not be
b860: 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20   called.  ** on 
b870: 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 72  the duplicate cr
b880: 65 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  eated by this fu
b890: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72  nction. */.  for
b8a0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20  (i=0; i<p->nId; 
b8b0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
b8c0: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e   IdList_item *pN
b8d0: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
b8e0: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
b8f0: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f   IdList_item *pO
b900: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
b910: 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  ];.    pNewItem-
b920: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
b930: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b940: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
b950: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78     pNewItem->idx
b960: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78   = pOldItem->idx
b970: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b980: 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73  New;.}.Select *s
b990: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
b9a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
b9b0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ect *p, int flag
b9c0: 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e  s){.  Select *pN
b9d0: 65 77 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 61  ew, *pPrior;.  a
b9e0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
b9f0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
ba00: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
ba10: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
ba20: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
ba30: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
ba40: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
ba50: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
ba60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
ba70: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
ba80: 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  st, flags);.  pN
ba90: 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  ew->pSrc = sqlit
baa0: 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c  e3SrcListDup(db,
bab0: 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29   p->pSrc, flags)
bac0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
bad0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
bae0: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
baf0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
bb00: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
bb10: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
bb20: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
bb30: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
bb40: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
bb50: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
bb60: 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b  pHaving, flags);
bb70: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
bb80: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
bb90: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
bba0: 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a  rderBy, flags);.
bbb0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
bbc0: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  op;.  pNew->pPri
bbd0: 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20 73 71  or = pPrior = sq
bbe0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
bbf0: 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c  b, p->pPrior, fl
bc00: 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ags);.  if( pPri
bc10: 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
bc20: 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65  xt = pNew;.  pNe
bc30: 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  w->pNext = 0;.  
bc40: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
bc50: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
bc60: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
bc70: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  gs);.  pNew->pOf
bc80: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
bc90: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66  prDup(db, p->pOf
bca0: 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  fset, flags);.  
bcb0: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
bcc0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
bcd0: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73  t = 0;.  pNew->s
bce0: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
bcf0: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
bd00: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65  Ephemeral;.  pNe
bd10: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
bd20: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
bd30: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
bd40: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e   = -1;.  pNew->n
bd50: 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e  SelectRow = p->n
bd60: 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65  SelectRow;.  pNe
bd70: 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44  w->pWith = withD
bd80: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29  up(db, p->pWith)
bd90: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
bda0: 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70  tSetName(pNew, p
bdb0: 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 72  ->zSelName);.  r
bdc0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65  eturn pNew;.}.#e
bdd0: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
bde0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
bdf0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
be00: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
be10: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
be20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
be30: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
be40: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
be50: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
be60: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
be70: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
be80: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
be90: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
bea0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
beb0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
bec0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
bed0: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
bee0: 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73  , the entire lis
bef0: 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a  t is freed and.*
bf00: 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  * NULL is return
bf10: 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c  ed.  If non-NULL
bf20: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
bf30: 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
bf40: 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  eed.** that the 
bf50: 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75  new entry was su
bf60: 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e  ccessfully appen
bf70: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ded..*/.ExprList
bf80: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
bf90: 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65  tAppend(.  Parse
bfa0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
bfb0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
bfc0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
bfd0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
bfe0: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
bff0: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
c000: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c010: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
c020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
c030: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
c040: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
c050: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
c060: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c070: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
c080: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
c090: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
c0a0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
c0b0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
c0c0: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  , sizeof(ExprLis
c0d0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
c0e0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
c0f0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
c100: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45   }.    pList->nE
c110: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69  xpr = 0;.    pLi
c120: 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  st->a = sqlite3D
c130: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c140: 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
c150: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70  [0]));.    if( p
c160: 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74  List->a==0 ) got
c170: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73  o no_mem;.  }els
c180: 65 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45  e if( (pList->nE
c190: 78 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45  xpr & (pList->nE
c1a0: 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20  xpr-1))==0 ){.  
c1b0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
c1c0: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61  t_item *a;.    a
c1d0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
c1e0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d  xpr>0 );.    a =
c1f0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
c200: 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20  c(db, pList->a, 
c210: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73  pList->nExpr*2*s
c220: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
c230: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d  ]));.    if( a==
c240: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
c250: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
c260: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
c270: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
c280: 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69  ist->a!=0 );.  i
c290: 66 28 20 31 20 29 7b 0a 20 20 20 20 73 74 72 75  f( 1 ){.    stru
c2a0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
c2b0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
c2c0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
c2d0: 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ++];.    memset(
c2e0: 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
c2f0: 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70  (*pItem));.    p
c300: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
c310: 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  xpr;.  }.  retur
c320: 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d  n pList;..no_mem
c330: 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69  :     .  /* Avoi
c340: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
c350: 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66   if malloc has f
c360: 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69  ailed. */.  sqli
c370: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
c380: 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  , pExpr);.  sqli
c390: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
c3a0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
c3b0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
c3c0: 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20  ** pColumns and 
c3d0: 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65 63  pExpr form a vec
c3e0: 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20 77  tor assignment w
c3f0: 68 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 20  hich is part of 
c400: 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73  the SET.** claus
c410: 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73  e of an UPDATE s
c420: 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20  tatement.  Like 
c430: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
c440: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65 78     (a,b,c) = (ex
c450: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
c460: 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c  .** Or:    (a,b,
c470: 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c 79  c) = (SELECT x,y
c480: 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a  ,z FROM ....).**
c490: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72  .** For each ter
c4a0: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  m of the vector 
c4b0: 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65  assignment, appe
c4c0: 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74  nd new entries t
c4d0: 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  o the.** express
c4e0: 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20  ion list pList. 
c4f0: 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20   In the case of 
c500: 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  a subquery on th
c510: 65 20 4c 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a  e LHS, append.**
c520: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
c530: 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a  N expressions..*
c540: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
c550: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
c560: 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73 65  dVector(.  Parse
c570: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c580: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c590: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
c5a0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
c5b0: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
c5c0: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
c5d0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
c5e0: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73  IdList *pColumns
c5f0: 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ,      /* List o
c600: 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f  f names of LHS o
c610: 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e 74  f the assignment
c620: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
c630: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
c640: 56 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  Vector expressio
c650: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
c660: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
c670: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
c680: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c690: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
c6a0: 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74   i;.  int iFirst
c6b0: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
c6c0: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f  ->nExpr : 0;.  /
c6d0: 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f  * pColumns can o
c6e0: 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65 20  nly be NULL due 
c6f0: 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e  to an OOM but an
c700: 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20   OOM will cause 
c710: 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72 69  an.  ** exit pri
c720: 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
c730: 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64  ne being invoked
c740: 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
c750: 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67  pColumns==0) ) g
c760: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
c770: 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70  d_error;.  if( p
c780: 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76  Expr==0 ) goto v
c790: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
c7a0: 6f 72 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  or;.  n = sqlite
c7b0: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
c7c0: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 43  pExpr);.  if( pC
c7d0: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 6e 20 29  olumns->nId!=n )
c7e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
c7f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
c800: 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e  d columns assign
c810: 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20  ed %d values",. 
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64     pColumns->nId
c840: 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76  , n);.    goto v
c850: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
c860: 6f 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  or;.  }.  for(i=
c870: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
c880: 20 20 45 78 70 72 20 2a 70 53 75 62 45 78 70 72    Expr *pSubExpr
c890: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f   = sqlite3ExprFo
c8a0: 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61  rVectorField(pPa
c8b0: 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a  rse, pExpr, i);.
c8c0: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
c8d0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
c8e0: 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  d(pParse, pList,
c8f0: 20 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20   pSubExpr);.    
c900: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
c910: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
c920: 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b  ->nExpr==iFirst+
c930: 69 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69  i+1 );.      pLi
c940: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
c950: 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43  pr-1].zName = pC
c960: 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  olumns->a[i].zNa
c970: 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d  me;.      pColum
c980: 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  ns->a[i].zName =
c990: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
c9a0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
c9b0: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
c9c0: 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
c9d0: 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45  st->a[iFirst].pE
c9e0: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  xpr ){.      ass
c9f0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 5b 69 46  ert( pList->a[iF
ca00: 69 72 73 74 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  irst].pExpr->op=
ca10: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
ca20: 4e 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  N );.      pList
ca30: 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70  ->a[iFirst].pExp
ca40: 72 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70  r->pRight = pExp
ca50: 72 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  r;.      pExpr =
ca60: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 76   0;.    }.  }..v
ca70: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
ca80: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  or:.  sqlite3Exp
ca90: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
caa0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  r);.  sqlite3IdL
cab0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
cac0: 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72  olumns);.  retur
cad0: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
cae0: 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f  * Set the sort o
caf0: 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73  rder for the las
cb00: 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65  t element on the
cb10: 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e   given ExprList.
cb20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cb30: 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
cb40: 72 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70  rder(ExprList *p
cb50: 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72  , int iSortOrder
cb60: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
cb70: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
cb80: 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45  ( SQLITE_SO_UNDE
cb90: 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54  FINED<0 && SQLIT
cba0: 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53  E_SO_ASC>=0 && S
cbb0: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20  QLITE_SO_DESC>0 
cbc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
cbd0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28  nExpr>0 );.  if(
cbe0: 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b   iSortOrder<0 ){
cbf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
cc00: 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f  a[p->nExpr-1].so
cc10: 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f  rtOrder==SQLITE_
cc20: 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65  SO_ASC );.    re
cc30: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61  turn;.  }.  p->a
cc40: 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [p->nExpr-1].sor
cc50: 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f  tOrder = (u8)iSo
cc60: 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rtOrder;.}../*.*
cc70: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
cc80: 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65  st.a[].zName ele
cc90: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
cca0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
ccb0: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
ccc0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
ccd0: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
cce0: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
ccf0: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
cd00: 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f  .  But pName sho
cd10: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
cd20: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
cd30: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
cd40: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
cd50: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
cd60: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
cd70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
cd80: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
cd90: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
cda0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
cdb0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
cdc0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
cdd0: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
cde0: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
cdf0: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
ce00: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
ce10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
ce20: 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  me to be added *
ce30: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ce50: 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65  rue to cause the
ce60: 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75   name to be dequ
ce70: 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  oted */.){.  ass
ce80: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
ce90: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
cea0: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
ceb0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
cec0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
ced0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
cee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
cef0: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
cf00: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
cf10: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
cf20: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
cf30: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
cf40: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   );.    pItem->z
cf50: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
cf60: 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e  StrNDup(pParse->
cf70: 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  db, pName->z, pN
cf80: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28  ame->n);.    if(
cf90: 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74   dequote ) sqlit
cfa0: 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d  e3Dequote(pItem-
cfb0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  >zName);.  }.}..
cfc0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
cfd0: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e  prList.a[].zSpan
cfe0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
cff0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
d000: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
d010: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
d020: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
d030: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
d040: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
d050: 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e  rror.  But pSpan
d060: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
d070: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
d080: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
d090: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
d0a0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
d0b0: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
d0c0: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
d0d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
d0e0: 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Span(.  Parse *p
d0f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
d100: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d110: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
d120: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
d130: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
d140: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
d150: 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20  . */.  ExprSpan 
d160: 2a 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f  *pSpan         /
d170: 2a 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65  * The span to be
d180: 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73   added */.){.  s
d190: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d1a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
d1b0: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64  t( pList!=0 || d
d1c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
d1d0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
d1e0: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
d1f0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
d200: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
d210: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
d220: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
d230: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
d240: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
d250: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
d260: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53  pItem->pExpr==pS
d270: 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  pan->pExpr );.  
d280: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d290: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
d2a0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
d2b0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
d2c0: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
d2d0: 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c  *)pSpan->zStart,
d2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e       (int)(pSpan
d310: 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e  ->zEnd - pSpan->
d320: 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a  zStart));.  }.}.
d330: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
d340: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45  pression list pE
d350: 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  List contains mo
d360: 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65  re than iLimit e
d370: 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76  lements,.** leav
d380: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
d390: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
d3a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
d3b0: 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68  rListCheckLength
d3c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d3d0: 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  e,.  ExprList *p
d3e0: 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63  EList,.  const c
d3f0: 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a  har *zObject.){.
d400: 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73    int mx = pPars
d410: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
d420: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
d430: 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  N];.  testcase( 
d440: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
d450: 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20  ->nExpr==mx );. 
d460: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
d470: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
d480: 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66  pr==mx+1 );.  if
d490: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
d4a0: 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a  st->nExpr>mx ){.
d4b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d4c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
d4d0: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
d4e0: 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a   %s", zObject);.
d4f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
d500: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78  ete an entire ex
d510: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
d520: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
d530: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78  NOINLINE void ex
d540: 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73  prListDeleteNN(s
d550: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
d560: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
d570: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
d580: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
d590: 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  Item;.  assert( 
d5a0: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70  pList->a!=0 || p
d5b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29  List->nExpr==0 )
d5c0: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
d5d0: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
d5e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
d5f0: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
d600: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
d610: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78  e(db, pItem->pEx
d620: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
d630: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
d640: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
d650: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d660: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
d670: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
d680: 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
d690: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
d6a0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
d6b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
d6c0: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
d6d0: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
d6e0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20   *pList){.  if( 
d6f0: 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73 74  pList ) exprList
d700: 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69  DeleteNN(db, pLi
d710: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
d720: 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73 65  turn the bitwise
d730: 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e  -OR of all Expr.
d740: 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20  flags fields in 
d750: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70  the given.** Exp
d760: 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71  rList..*/.u32 sq
d770: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
d780: 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73  gs(const ExprLis
d790: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
d7a0: 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b   i;.  u32 m = 0;
d7b0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
d7c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d7d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
d7e0: 29 7b 0a 20 20 20 20 20 20 20 45 78 70 72 20 2a  ){.       Expr *
d7f0: 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
d800: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
d810: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21    assert( pExpr!
d820: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 6d 20 7c  =0 );.       m |
d830: 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a  = pExpr->flags;.
d840: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
d850: 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn m;.}../*.** T
d860: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
d870: 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  e Walker callbac
d880: 6b 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  ks used to check
d890: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a   expressions to.
d8a0: 2a 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61  ** see if they a
d8b0: 72 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f  re "constant" fo
d8c0: 72 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f  r some definitio
d8d0: 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20  n of constant.  
d8e0: 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43  The.** Walker.eC
d8f0: 6f 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d  ode value determ
d900: 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ines the type of
d910: 20 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61   "constant" we a
d920: 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f  re looking.** fo
d930: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  r..**.** These c
d940: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73  allback routines
d950: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70   are used to imp
d960: 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f  lement the follo
d970: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
d980: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
d990: 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20  stant()         
d9a0: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
d9b0: 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20  ->eCode==1.**   
d9c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
d9d0: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29  onstantNotJoin()
d9e0: 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b             pWalk
d9f0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20  er->eCode==2.** 
da00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
da10: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29  sTableConstant()
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
da30: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a  lker->eCode==3.*
da40: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
da50: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
da60: 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70  ction()        p
da70: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
da80: 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61   or 5.**.** In a
da90: 6c 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61  ll cases, the ca
daa0: 6c 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b  llbacks set Walk
dab0: 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61  er.eCode=0 and a
dac0: 62 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72  bort if the expr
dad0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75  ession.** is fou
dae0: 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63  nd to not be a c
daf0: 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  onstant..**.** T
db00: 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  he sqlite3ExprIs
db10: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
db20: 6f 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72  on() is used for
db30: 20 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72   evaluating expr
db40: 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20  essions.** in a 
db50: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
db60: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c  tement.  The Wal
db70: 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20  ker.eCode value 
db80: 69 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e  is 5 when parsin
db90: 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  g.** an existing
dba0: 20 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68   schema and 4 wh
dbb0: 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  en processing a 
dbc0: 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  new statement.  
dbd0: 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  A bound.** param
dbe0: 65 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65  eter raises an e
dbf0: 72 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61  rror for new sta
dc00: 74 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20  tements, but is 
dc10: 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  silently convert
dc20: 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f  ed.** to NULL fo
dc30: 72 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d  r existing schem
dc40: 61 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  as.  This allows
dc50: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
dc60: 61 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63  ables that .** c
dc70: 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70  ontain a bound p
dc80: 61 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65  arameter because
dc90: 20 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72   they were gener
dca0: 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65  ated by older ve
dcb0: 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
dcc0: 69 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64  ite to be parsed
dcd0: 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f   by newer versio
dce0: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74  ns of SQLite wit
dcf0: 68 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a  hout raising a.*
dd00: 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65  * malformed sche
dd10: 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  ma error..*/.sta
dd20: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
dd30: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
dd40: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
dd50: 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20   *pExpr){..  /* 
dd60: 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  If pWalker->eCod
dd70: 65 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20  e is 2 then any 
dd80: 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72  term of the expr
dd90: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65  ession that come
dda0: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  s from.  ** the 
ddb0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
ddc0: 73 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  ses of a left jo
ddd0: 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20  in disqualifies 
dde0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
ddf0: 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63   ** from being c
de00: 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61  onsidered consta
de10: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61  nt. */.  if( pWa
de20: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26  lker->eCode==2 &
de30: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
de40: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
de50: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61  Join) ){.    pWa
de60: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
de70: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
de80: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77  Abort;.  }..  sw
de90: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
dea0: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
deb0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
dec0: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
ded0: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
dee0: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
def0: 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65      ** and eithe
df00: 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  r pWalker->eCode
df10: 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20  ==4 or 5 or the 
df20: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65  function has the
df30: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  .    ** SQLITE_F
df40: 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20  UNC_CONST flag. 
df50: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
df60: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
df70: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
df80: 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50  e>=4 || ExprHasP
df90: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50  roperty(pExpr,EP
dfa0: 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20  _ConstFunc) ){. 
dfb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
dfc0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
dfd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dfe0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
dff0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
e000: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
e010: 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20       }.    case 
e020: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
e030: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
e040: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
e050: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
e060: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
e070: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
e080: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
e090: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e0a0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
e0b0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
e0c0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
e0d0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
e0e0: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
e0f0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
e100: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
e110: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  );.      if( pWa
e120: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26  lker->eCode==3 &
e130: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
e140: 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72  =pWalker->u.iCur
e150: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e160: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
e170: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e180: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
e190: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
e1a0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e1b0: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
e1c0: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
e1d0: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
e1e0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b  ker->eCode==5 ){
e1f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65  .        /* Sile
e200: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75  ntly convert bou
e210: 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  nd parameters th
e220: 61 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65  at appear inside
e230: 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20   of CREATE.     
e240: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
e250: 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65   into a NULL whe
e260: 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52  n parsing the CR
e270: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  EATE statement t
e280: 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20  ext out.        
e290: 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ** of the sqlite
e2a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f  _master table */
e2b0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
e2c0: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
e2d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
e2e0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
e2f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
e300: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
e310: 69 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74  in a CREATE stat
e320: 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69  ement that origi
e330: 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20  nates from.     
e340: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72     ** sqlite3_pr
e350: 65 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61  epare() causes a
e360: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
e370: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
e380: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
e390: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
e3a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
e3b0: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
e3c0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  /.    default:. 
e3d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
e3e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
e3f0: 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  ECT ); /* select
e400: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
e410: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
e420: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e430: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
e440: 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63  ISTS ); /* selec
e450: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20  tNodeIsConstant 
e460: 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f  will disallow */
e470: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
e480: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
e490: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  }.static int sel
e4a0: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
e4b0: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
e4c0: 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73  r, Select *NotUs
e4d0: 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
e4e0: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
e4f0: 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  ;.  pWalker->eCo
e500: 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  de = 0;.  return
e510: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
e520: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
e530: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
e540: 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20  t initFlag, int 
e550: 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  iCur){.  Walker 
e560: 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
e570: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
e580: 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46   w.eCode = initF
e590: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
e5a0: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
e5b0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
e5c0: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
e5d0: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
e5e0: 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69  onstant;.  w.u.i
e5f0: 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71  Cur = iCur;.  sq
e600: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
e610: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
e620: 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
e630: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
e640: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
e650: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
e660: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e670: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
e680: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
e690: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
e6a0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
e6b0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
e6c0: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
e6d0: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
e6e0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
e6f0: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
e700: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
e710: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
e720: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
e730: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
e740: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
e750: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
e760: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
e770: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
e780: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c  xprIsConst(p, 1,
e790: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   0);.}../*.** Wa
e7a0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
e7b0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
e7c0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
e7d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
e7e0: 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f  stant.** that do
e7f0: 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20  es no originate 
e800: 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55  from the ON or U
e810: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
e820: 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72  a join..** Retur
e830: 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  n 0 if it involv
e840: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
e850: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f  function calls o
e860: 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20  r terms from.** 
e870: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
e880: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
e890: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
e8a0: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20  antNotJoin(Expr 
e8b0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
e8c0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20  prIsConst(p, 2, 
e8d0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
e8e0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
e8f0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
e900: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
e910: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
e920: 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20  tant.** for any 
e930: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
e940: 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72  e table with cur
e950: 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74  sor iCur.  In ot
e960: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a  her words, the.*
e970: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  * expression mus
e980: 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61  t not refer to a
e990: 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  ny non-determini
e9a0: 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  stic function no
e9b0: 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f  r any.** table o
e9c0: 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a  ther than iCur..
e9d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
e9e0: 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
e9f0: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
ea00: 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65  Cur){.  return e
ea10: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c  xprIsConst(p, 3,
ea20: 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iCur);.}../*.**
ea30: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
ea40: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
ea50: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
ea60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ea70: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
ea80: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
ea90: 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
eaa0: 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
eab0: 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
eac0: 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
ead0: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
eae0: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
eaf0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
eb00: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
eb10: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
eb20: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
eb30: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
eb40: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
eb50: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
eb60: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
eb70: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
eb80: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
eb90: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
eba0: 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29  r *p, u8 isInit)
ebb0: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e  {.  assert( isIn
ebc0: 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d  it==0 || isInit=
ebd0: 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
ebe0: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b  xprIsConst(p, 4+
ebf0: 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23  isInit, 0);.}..#
ec00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ec10: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
ec20: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
ec30: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
ec40: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
ec50: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
ec60: 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65  ains a.** subque
ec70: 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  ry of some kind.
ec80: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
ec90: 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75  ere are no subqu
eca0: 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eries..*/.int sq
ecb0: 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e  lite3ExprContain
ecc0: 73 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a  sSubquery(Expr *
ecd0: 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
ece0: 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
ecf0: 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
ed00: 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
ed10: 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
ed20: 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
ed30: 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  op;.  w.xSelectC
ed40: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
ed50: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
ed60: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
ed70: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
ed80: 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d  rn w.eCode==0;.}
ed90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
eda0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
edb0: 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74   p codes a const
edc0: 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74  ant integer that
edd0: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
ede0: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
edf0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
ee00: 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74  return 1 and put
ee10: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
ee20: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20  e integer.** in 
ee30: 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65  *pValue.  If the
ee40: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
ee50: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  ot an integer or
ee60: 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69   if it is too bi
ee70: 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  g.** to fit in a
ee80: 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69   signed 32-bit i
ee90: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30  nteger, return 0
eea0: 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c   and leave *pVal
eeb0: 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ue unchanged..*/
eec0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
eed0: 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a  IsInteger(Expr *
eee0: 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b  p, int *pValue){
eef0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a  .  int rc = 0;..
ef00: 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65    /* If an expre
ef10: 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
ef20: 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ger literal that
ef30: 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65   fits in a signe
ef40: 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e  d 32-bit.  ** in
ef50: 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
ef60: 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67  EP_IntValue flag
ef70: 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
ef80: 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20  dy been set */. 
ef90: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
efa0: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70  TK_INTEGER || (p
efb0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
efc0: 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20  Value)!=0.      
efd0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
efe0: 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f  etInt32(p->u.zTo
eff0: 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a  ken, &rc)==0 );.
f000: 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
f010: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
f020: 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70  .    *pValue = p
f030: 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
f040: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
f050: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
f060: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
f070: 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
f080: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
f090: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
f0a0: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
f0b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f0c0: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
f0d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
f0e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
f0f0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
f100: 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
f110: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76         assert( v
f120: 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31  !=(-2147483647-1
f130: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) );.        *pV
f140: 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
f150: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
f160: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f170: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
f180: 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  t: break;.  }.  
f190: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f1a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
f1b0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
f1c0: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
f1d0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
f1e0: 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e NULL..**.** If
f1f0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f200: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72  might be NULL or
f210: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
f220: 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65  on is too comple
f230: 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74  x.** to tell ret
f240: 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a  urn TRUE.  .**.*
f250: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f260: 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74  s used as an opt
f270: 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b  imization, to sk
f280: 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63  ip OP_IsNull opc
f290: 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20  odes.** when we 
f2a0: 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75  know that a valu
f2b0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  e cannot be NULL
f2c0: 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73  .  Hence, a fals
f2d0: 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72  e positive.** (r
f2e0: 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68  eturning TRUE wh
f2f0: 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65  en in fact the e
f300: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65  xpression can ne
f310: 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67  ver be NULL) mig
f320: 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c  ht.** be a small
f330: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
f340: 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
f350: 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20  e harmless.  On 
f360: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e  the other.** han
f370: 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74  d, a false negat
f380: 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46  ive (returning F
f390: 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65  ALSE when the re
f3a0: 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55  sult could be NU
f3b0: 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65  LL).** will like
f3c0: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
f3d0: 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
f3e0: 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f  .  So when in do
f3f0: 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54  ubt, return.** T
f400: 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  RUE..*/.int sqli
f410: 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
f420: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b  (const Expr *p){
f430: 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c  .  u8 op;.  whil
f440: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
f450: 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
f460: 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
f470: 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
f480: 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
f490: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
f4a0: 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
f4b0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
f4c0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
f4d0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
f4e0: 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
f4f0: 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
f500: 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  e TK_BLOB:.     
f510: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63   return 0;.    c
f520: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
f530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
f540: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
f550: 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50   return ExprHasP
f560: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61  roperty(p, EP_Ca
f570: 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20  nBeNull) ||.    
f580: 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f           (p->iCo
f590: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54  lumn>=0 && p->pT
f5a0: 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c  ab->aCol[p->iCol
f5b0: 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29  umn].notNull==0)
f5c0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
f5d0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
f5e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
f5f0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
f600: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
f610: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68  is a constant wh
f620: 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20  ich would be.** 
f630: 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f  unchanged by OP_
f640: 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68  Affinity with th
f650: 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e  e affinity given
f660: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   in the second.*
f670: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
f680: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f690: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
f6a0: 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66  ine if the OP_Af
f6b0: 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e  finity operation
f6c0: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  .** can be omitt
f6d0: 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75  ed.  When in dou
f6e0: 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  bt return FALSE.
f6f0: 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69    A false negati
f700: 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73  ve.** is harmles
f710: 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69  s.  A false posi
f720: 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63  tive, however, c
f730: 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65  an result in the
f740: 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72   wrong.** answer
f750: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f760: 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
f770: 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20  ityChange(const 
f780: 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66  Expr *p, char af
f790: 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69  f){.  u8 op;.  i
f7a0: 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  f( aff==SQLITE_A
f7b0: 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e  FF_BLOB ) return
f7c0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   1;.  while( p->
f7d0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
f7e0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
f7f0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
f800: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
f810: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
f820: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
f830: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
f840: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
f850: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
f860: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
f870: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
f880: 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ER || aff==SQLIT
f890: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
f8a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f8b0: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
f8c0: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
f8d0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61  TE_AFF_REAL || a
f8e0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
f8f0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
f900: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
f910: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
f920: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
f930: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _TEXT;.    }.   
f940: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
f950: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
f960: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f970: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
f980: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54     assert( p->iT
f990: 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70  able>=0 );  /* p
f9a0: 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20   cannot be part 
f9b0: 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74  of a CHECK const
f9c0: 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72  raint */.      r
f9d0: 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e  eturn p->iColumn
f9e0: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  <0.          && 
f9f0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
fa00: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
fa10: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
fa20: 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RIC);.    }.    
fa30: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
fa40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
fa50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
fa60: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
fa70: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73   given string is
fa80: 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e   a row-id column
fa90: 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   name..*/.int sq
faa0: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e  lite3IsRowid(con
fab0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
fac0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
fad0: 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d  p(z, "_ROWID_")=
fae0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
faf0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
fb00: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
fb10: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
fb20: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
fb30: 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
fb40: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
fb50: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
fb60: 2a 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20  * pX is the RHS 
fb70: 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  of an IN operato
fb80: 72 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53  r.  If pX is a S
fb90: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
fba0: 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20  .** that can be 
fbb0: 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20  simplified to a 
fbc0: 64 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63  direct table acc
fbd0: 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ess, then return
fbe0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
fbf0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
fc00: 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73  ement.  If pX is
fc10: 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74   not a SELECT st
fc20: 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69  atement,.** or i
fc30: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
fc40: 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  tement needs to 
fc50: 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e  be manifested in
fc60: 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a  to a transient.*
fc70: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65  * table, then re
fc80: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69  turn NULL..*/.#i
fc90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fca0: 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69  T_SUBQUERY.stati
fcb0: 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64  c Select *isCand
fcc0: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78  idateForInOpt(Ex
fcd0: 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63  pr *pX){.  Selec
fce0: 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20  t *p;.  SrcList 
fcf0: 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
fd00: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
fd10: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
fd20: 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  i;.  if( !ExprHa
fd30: 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
fd40: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72 65  _xIsSelect) ) re
fd50: 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20  turn 0;  /* Not 
fd60: 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  a subquery */.  
fd70: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
fd80: 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65  rty(pX, EP_VarSe
fd90: 6c 65 63 74 29 20 20 29 20 72 65 74 75 72 6e 20  lect)  ) return 
fda0: 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65  0;  /* Correlate
fdb0: 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20  d subq */.  p = 
fdc0: 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pX->x.pSelect;. 
fdd0: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
fde0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
fdf0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61          /* Not a
fe00: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
fe10: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
fe20: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
fe30: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
fe40: 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  e) ){.    testca
fe50: 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
fe60: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
fe70: 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
fe80: 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
fe90: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
fea0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
feb0: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
fec0: 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
fed0: 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74  egate );.    ret
fee0: 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53  urn 0; /* No DIS
fef0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e  TINCT keyword an
ff00: 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  d no aggregate f
ff10: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a  unctions */.  }.
ff20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
ff30: 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20  oupBy==0 );     
ff40: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
ff50: 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
ff60: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  se */.  if( p->p
ff70: 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
ff80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
ff90: 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63  * Has no LIMIT c
ffa0: 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lause */.  asser
ffb0: 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
ffc0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
ffd0: 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65    /* No LIMIT me
ffe0: 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f  ans no OFFSET */
fff0: 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
10000 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
10020 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
10030 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   */.  pSrc = p->
10040 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
10050 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
10060 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
10070 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
10080 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65      /* Single te
10090 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  rm in FROM claus
100a0 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  e */.  if( pSrc-
100b0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20  >a[0].pSelect ) 
100c0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
100d0 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73   FROM is not a s
100e0 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20  ubquery or view 
100f0 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  */.  pTab = pSrc
10100 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61  ->a[0].pTab;.  a
10110 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
10120 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
10130 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ->pSelect==0 ); 
10140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
10150 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  OM clause is not
10160 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28   a view */.  if(
10170 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
10180 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
10190 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
101a0 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  se not a virtual
101b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69   table */.  pELi
101c0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
101d0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
101e0 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20  !=0 );.  /* All 
101f0 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d  SELECT results m
10200 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20  ust be columns. 
10210 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
10220 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
10230 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
10240 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Res = pEList->a[
10250 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
10260 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43  ( pRes->op!=TK_C
10270 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
10280 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
10290 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  es->iTable==pSrc
102a0 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[0].iCursor )
102b0 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72  ;  /* Not a corr
102c0 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20  elated subquery 
102d0 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
102e0 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  p;.}.#endif /* S
102f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
10300 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
10310 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
10320 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
10330 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68  ate code that ch
10340 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  ecks the left-mo
10350 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  st column of ind
10360 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f  ex table iCur to
10370 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f   see if.** it co
10380 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
10390 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20  entries.  Cause 
103a0 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20  the register at 
103b0 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65  regHasNull to be
103c0 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e   set.** to a non
103d0 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69  -NULL value if i
103e0 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  Cur contains no 
103f0 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65  NULLs.  Cause re
10400 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c  gister regHasNul
10410 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74  l.** to be set t
10420 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63  o NULL if iCur c
10430 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
10440 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
10450 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10460 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
10470 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69  lFlag(Vdbe *v, i
10480 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67  nt iCur, int reg
10490 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20  HasNull){.  int 
104a0 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33  addr1;.  sqlite3
104b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
104c0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
104d0 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  HasNull);.  addr
104e0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
104f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
10500 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43  nd, iCur); VdbeC
10510 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
10520 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10530 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43  v, OP_Column, iC
10540 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  ur, 0, regHasNul
10550 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
10560 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
10570 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
10580 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
10590 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69  , "first_entry_i
105a0 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a  n(%d)", iCur));.
105b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
105c0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
105d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
105e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
105f0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
10600 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
10610 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
10620 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  th a list (not a
10630 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68   subquery) on th
10640 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
10650 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54   side.  Return T
10660 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74  RUE if that list
10670 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f   is constant..*/
10680 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
10690 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
106a0 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  nt(Expr *pIn){. 
106b0 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69   Expr *pLHS;.  i
106c0 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
106d0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
106e0 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65  ty(pIn, EP_xIsSe
106f0 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20  lect) );.  pLHS 
10700 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20  = pIn->pLeft;.  
10710 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  pIn->pLeft = 0;.
10720 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45    res = sqlite3E
10730 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49  xprIsConstant(pI
10740 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  n);.  pIn->pLeft
10750 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72   = pLHS;.  retur
10760 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n res;.}.#endif.
10770 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
10780 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
10790 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
107a0 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
107b0 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
107c0 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72  The pX parameter
107d0 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
107e0 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  on on the RHS of
107f0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
10800 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  , which.** might
10810 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73   be either a lis
10820 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
10830 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
10840 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
10850 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10860 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61   to find or crea
10870 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65  te a b-tree obje
10880 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  ct that can.** b
10890 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f  e used either to
108a0 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
108b0 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20  ship in the RHS 
108c0 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
108d0 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c  e through.** all
108e0 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20   members of the 
108f0 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e  RHS set, skippin
10900 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
10910 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20  .** A cursor is 
10920 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
10930 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
10940 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74   is the RHS of t
10950 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
10960 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
10970 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
10980 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
10990 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
109a0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
109b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
109c0 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
109d0 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
109e0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
109f0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
10a00 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
10a10 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
10a20 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
10a30 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
10a40 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
10a50 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
10a60 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
10a70 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
10a80 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
10a90 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
10aa0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
10ab0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
10ac0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
10ad0 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
10ae0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
10af0 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
10b00 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
10b30 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
10b40 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e  .**   IN_INDEX_N
10b50 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63  OOP       - No c
10b60 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61  ursor was alloca
10b70 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  ted.  The IN ope
10b80 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  rator must be.**
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ba0 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65           impleme
10bb0 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e  nted as a sequen
10bc0 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
10bd0 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  s..**.** An exis
10be0 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
10bf0 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
10c00 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
10c10 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
10c20 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
10c30 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
10c40 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20  LECT <column1>, 
10c50 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f  <column2>... FRO
10c60 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
10c70 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
10c80 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
10c90 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72   a list or a mor
10ca0 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65  e complex subque
10cb0 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65  ry, then.** an e
10cc0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d  phemeral table m
10cd0 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
10ce0 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
10cf0 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a  he RHS and then.
10d00 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61  ** pX->iTable ma
10d10 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
10d20 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
10d30 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  le instead of an
10d40 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62  .** existing tab
10d50 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  le..**.** The in
10d60 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
10d70 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61  must contain exa
10d80 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
10d90 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  bits.** IN_INDEX
10da0 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49  _MEMBERSHIP or I
10db0 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49  N_INDEX_LOOP.  I
10dc0 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69  f inFlags contai
10dd0 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ns.** IN_INDEX_M
10de0 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20  EMBERSHIP, then 
10df0 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61  the generated ta
10e00 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ble will be used
10e10 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d   for a.** fast m
10e20 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20  embership test. 
10e30 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44   When the IN_IND
10e40 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73  EX_LOOP bit is s
10e50 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e  et, the.** IN in
10e60 64 65 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64  dex will be used
10e70 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c   to loop over al
10e80 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  l values of the 
10e90 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  RHS of the.** IN
10ea0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
10eb0 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c   When IN_INDEX_L
10ec0 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e 64  OOP is used (and
10ed0 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
10ee0 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72   be used to iter
10ef0 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74  ate.** through t
10f00 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20  he set members) 
10f10 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  then the b-tree 
10f20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  must not contain
10f30 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20   duplicates..** 
10f40 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  An epheremal tab
10f50 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
10f60 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
10f70 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
10f80 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
10f90 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
10fa0 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
10fb0 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
10fc0 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20  MARY KEY or due 
10fd0 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63  to.** a UNIQUE c
10fe0 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64  onstraint or ind
10ff0 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  ex..**.** When I
11000 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
11010 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  IP is used (and 
11020 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
11030 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
11040 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
11050 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20  hip tests) then 
11060 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
11070 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
11080 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
11090 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65  mns> is a single
110a0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
110b0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61   KEY column or a
110c0 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20  n .** index can 
110d0 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68  be found with th
110e0 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c  e specified <col
110f0 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66  umns> as its lef
11100 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t-most..**.** If
11110 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   the IN_INDEX_NO
11120 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44  OP_OK and IN_IND
11130 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72  EX_MEMBERSHIP ar
11140 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a  e both set and.*
11150 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
11160 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
11170 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  is a list (not a
11180 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
11190 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
111a0 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61  might decide tha
111b0 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  t creating an ep
111c0 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66  hemeral b-tree f
111d0 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a  or membership.**
111e0 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20   testing is too 
111f0 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65  expensive and re
11200 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
11210 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  OP.  In that cas
11220 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  e, the.** callin
11230 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  g routine should
11240 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
11250 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67  N operator using
11260 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f   a sequence.** o
11270 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61  f Eq or Ne compa
11280 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
11290 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
112a0 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
112b0 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
112c0 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
112d0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
112e0 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74  .** might need t
112f0 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
11300 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69  r not the RHS si
11310 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
11320 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  rator.** contain
11330 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72  s a NULL.  If pr
11340 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f  RhsHasNull is no
11350 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
11360 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
11370 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
11380 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
11390 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
113a0 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
113b0 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
113c0 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
113d0 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
113e0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
113f0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52  itten.** to *prR
11400 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68  hsHasNull. If th
11410 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
11420 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
11430 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
11440 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
11450 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
11460 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
11470 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
11480 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
11490 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
114a0 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52  n stored in *prR
114b0 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a  hsHasNull, then.
114c0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ** the value in 
114d0 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69  that register wi
114e0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
114f0 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
11500 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  s one or more.**
11510 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e   NULL values, an
11520 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d  d it will be som
11530 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  e non-NULL value
11540 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
11550 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55  ontains no.** NU
11560 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
11570 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61   If the aiMap pa
11580 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e  rameter is not N
11590 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69  ULL, it must poi
115a0 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63  nt to an array c
115b0 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65  ontaining.** one
115c0 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63   element for eac
115d0 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
115e0 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
115f0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65  statement on the
11600 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49   RHS.** of the I
11610 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e  N(...) operator.
11620 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20   The i'th entry 
11630 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  of the array is 
11640 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
11650 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20  he.** offset of 
11660 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
11670 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
11680 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65  e i'th column re
11690 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
116a0 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61   SELECT. For exa
116b0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70  mple, if the exp
116c0 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65  ression and sele
116d0 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a  cted index are:.
116e0 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20  **.**   (?,?,?) 
116f0 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c  IN (SELECT a, b,
11700 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20   c FROM t1).**  
11710 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
11720 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b   ON t1(b, c, a);
11730 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61  .**.** then aiMa
11740 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64  p[] is populated
11750 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e   with {2, 0, 1}.
11760 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
11770 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
11780 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
11790 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  InIndex(.  Parse
117a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
117b0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
117c0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
117d0 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20  pr *pX,         
117e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
117f0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
11800 28 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20  (RHS) of the IN 
11810 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33  operator */.  u3
11820 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20  2 inFlags,      
11830 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49           /* IN_I
11840 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42  NDEX_LOOP, _MEMB
11850 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f  ERSHIP, and/or _
11860 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74  NOOP_OK */.  int
11870 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
11880 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
11890 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c  ter holding NULL
118a0 20 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f   status.  See no
118b0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  tes */.  int *ai
118c0 4d 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Map             
118d0 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
118e0 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73  rom Index fields
118f0 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a   to RHS fields *
11900 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
11910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11930 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69  SELECT to the ri
11940 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ght of IN operat
11950 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  or */.  int eTyp
11960 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11980 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62   Type of RHS tab
11990 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a  le. IN_INDEX_* *
119a0 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
119b0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
119c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
119d0 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74  sor of the RHS t
119e0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
119f0 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20  stBeUnique;     
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a10 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d  /* True if RHS m
11a20 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f  ust be unique */
11a30 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
11a40 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
11a50 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74  se);     /* Virt
11a60 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
11a70 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73  g coded */..  as
11a80 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
11a90 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55  _IN );.  mustBeU
11aa0 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73  nique = (inFlags
11ab0 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
11ac0 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  )!=0;..  /* If t
11ad0 68 65 20 52 48 53 20 6f 66 20 74 68 69 73 20 49  he RHS of this I
11ae0 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20  N(...) operator 
11af0 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64  is a SELECT, and
11b00 20 69 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a   if it matters .
11b10 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
11b20 6e 6f 74 20 74 68 65 20 53 45 4c 45 43 54 20 72  not the SELECT r
11b30 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e  esult contains N
11b40 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63  ULL values, chec
11b50 6b 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f  k whether.  ** o
11b60 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63  r not NULL is ac
11b70 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  tually possible 
11b80 28 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20  (it may not be, 
11b90 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65  for example, due
11ba0 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55   .  ** to NOT NU
11bb0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  LL constraints i
11bc0 6e 20 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49  n the schema). I
11bd0 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73  f no NULL values
11be0 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20   are possible,. 
11bf0 20 2a 2a 20 73 65 74 20 70 72 52 68 73 48 61 73   ** set prRhsHas
11c00 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65  Null to 0 before
11c10 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f   continuing.  */
11c20 0a 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e  .  if( prRhsHasN
11c30 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67  ull && (pX->flag
11c40 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
11c50 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
11c60 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
11c70 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65  List = pX->x.pSe
11c80 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
11c90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
11ca0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
11cb0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
11cc0 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
11cd0 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
11ce0 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  xpr) ) break;.  
11cf0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70    }.    if( i==p
11d00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
11d10 20 20 20 20 20 20 70 72 52 68 73 48 61 73 4e 75        prRhsHasNu
11d20 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ll = 0;.    }.  
11d30 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
11d40 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74   see if an exist
11d50 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
11d60 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ex can be used t
11d70 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74  o.  ** satisfy t
11d80 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
11d90 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f  is preferable to
11da0 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65   generating a ne
11db0 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61  w .  ** ephemera
11dc0 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69  l table.  */.  i
11dd0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
11de0 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e  =0 && (p = isCan
11df0 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
11e00 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  X))!=0 ){.    sq
11e10 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
11e20 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
11e30 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
11e40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
11e50 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
11e80 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
11e90 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20     i16 iDb;     
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
11ec0 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54  abase idx for pT
11ed0 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  ab */.    ExprLi
11ee0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e  st *pEList = p->
11ef0 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  pEList;.    int 
11f00 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
11f10 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65  nExpr;..    asse
11f20 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
11f30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
11f40 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
11f50 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
11f60 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
11f70 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  rt( p->pEList->a
11f80 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20  [0].pExpr!=0 ); 
11f90 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
11fa0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
11fb0 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
11fc0 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
11fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11fe0 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
11ff0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
12000 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62  t(p) */.    pTab
12010 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
12020 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43  .pTab;..    /* C
12030 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61  ode an OP_Transa
12040 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62  ction and OP_Tab
12050 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c  leLock for <tabl
12060 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  e>. */.    iDb =
12070 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
12080 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
12090 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
120a0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
120b0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
120c0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  b);.    sqlite3T
120d0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
120e0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
120f0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
12100 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 76  );..    assert(v
12110 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47 65  );  /* sqlite3Ge
12120 74 56 64 62 65 28 29 20 68 61 73 20 61 6c 77 61  tVdbe() has alwa
12130 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ys been previous
12140 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20  ly called */.   
12150 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26   if( nExpr==1 &&
12160 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
12170 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
12180 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  {.      /* The "
12190 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77  x IN (SELECT row
121a0 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 20  id FROM table)" 
121b0 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  case */.      in
121c0 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
121d0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
121e0 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 56  P_Once);.      V
121f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
12200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
12210 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
12220 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
12230 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
12240 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
12250 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20  INDEX_ROWID;..  
12260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
12270 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
12280 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12290 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
122c0 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
122d0 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e  .      int affin
122e0 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20  ity_ok = 1;.    
122f0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20    int i;..      
12300 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
12310 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
12320 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
12330 70 65 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20  perform each .  
12340 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
12350 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
12360 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
12370 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20   each column in 
12380 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f  table.      ** o
12390 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
123a0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49   IN operator.  I
123b0 66 20 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20  f it not, it is 
123c0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a  not possible to.
123d0 20 20 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79        ** use any
123e0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48   index of the RH
123f0 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  S table.  */.   
12400 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
12410 78 70 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f  xpr && affinity_
12420 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ok; i++){.      
12430 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
12440 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
12450 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
12460 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
12470 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73  int iCol = pELis
12480 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69  t->a[i].pExpr->i
12490 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
124a0 63 68 61 72 20 69 64 78 61 66 66 20 3d 20 73 71  char idxaff = sq
124b0 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e  lite3TableColumn
124c0 41 66 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43  Affinity(pTab,iC
124d0 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c  ol); /* RHS tabl
124e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  e */.        cha
124f0 72 20 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74  r cmpaff = sqlit
12500 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
12510 79 28 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b  y(pLhs, idxaff);
12520 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
12530 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
12540 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20  E_AFF_BLOB );.  
12550 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12560 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  cmpaff==SQLITE_A
12570 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20  FF_TEXT );.     
12580 20 20 20 73 77 69 74 63 68 28 20 63 6d 70 61 66     switch( cmpaf
12590 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  f ){.          c
125a0 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  ase SQLITE_AFF_B
125b0 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20  LOB:.           
125c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
125d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
125e0 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20  F_TEXT:.        
125f0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f      /* sqlite3Co
12600 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 29 20  mpareAffinity() 
12610 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58  only returns TEX
12620 54 20 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72  T if one side or
12630 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
12640 20 2a 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f   ** other has no
12650 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68   affinity and th
12660 65 20 6f 74 68 65 72 20 73 69 64 65 20 69 73 20  e other side is 
12670 54 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20  TEXT.  Hence,.  
12680 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
12690 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d   only way for cm
126a0 70 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 20  paff to be TEXT 
126b0 69 73 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f  is for idxaff to
126c0 20 62 65 20 54 45 58 54 0a 20 20 20 20 20 20 20   be TEXT.       
126d0 20 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20       ** and for 
126e0 74 68 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  the term on the 
126f0 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f  LHS of the IN to
12700 20 68 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74   have no affinit
12710 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  y. */.          
12720 20 20 61 73 73 65 72 74 28 20 69 64 78 61 66 66    assert( idxaff
12730 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
12740 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  T );.           
12750 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
12760 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
12770 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f         affinity_
12780 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75  ok = sqlite3IsNu
12790 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64  mericAffinity(id
127a0 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d  xaff);.        }
127b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
127c0 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  if( affinity_ok 
127d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ){.        /* Se
127e0 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
127f0 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
12800 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68  will work for th
12810 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  is IN operator *
12820 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  /.        for(pI
12830 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
12840 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d   pIdx && eType==
12850 30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  0; pIdx=pIdx->pN
12860 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
12870 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b  Bitmask colUsed;
12880 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73        /* Columns
12890 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 75 73   of the index us
128a0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
128b0 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20  Bitmask mCol;   
128c0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f        /* Mask fo
128d0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
128e0 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lumn */.        
128f0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
12900 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74  umn<nExpr ) cont
12910 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
12920 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75  /* Maximum nColu
12930 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74  mn is BMS-2, not
12940 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20   BMS-1, so that 
12950 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20  we can compute. 
12960 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d           ** BITM
12970 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f  ASK(nExpr) witho
12980 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a  ut overflowing *
12990 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
129a0 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
129b0 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  umn==BMS-2 );.  
129c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
129d0 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ( pIdx->nColumn=
129e0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
129f0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
12a00 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63  olumn>=BMS-1 ) c
12a10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12a20 20 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69     if( mustBeUni
12a30 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  que ){.         
12a40 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65     if( pIdx->nKe
12a50 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20  yCol>nExpr.     
12a60 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d          ||(pIdx-
12a70 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26  >nColumn>nExpr &
12a80 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78  & !IsUniqueIndex
12a90 28 70 49 64 78 29 29 0a 20 20 20 20 20 20 20 20  (pIdx)).        
12aa0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
12ab0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
12ac0 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73  /* This index is
12ad0 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72   not unique over
12ae0 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75   the IN RHS colu
12af0 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  mns */.         
12b00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
12b10 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f  .  .          co
12b20 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20  lUsed = 0;   /* 
12b30 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78  Columns of index
12b40 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a   used so far */.
12b50 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
12b60 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
12b70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
12b80 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74  pr *pLhs = sqlit
12b90 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
12ba0 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20  expr(pX->pLeft, 
12bb0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
12bc0 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c  Expr *pRhs = pEL
12bd0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
12be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c  .            Col
12bf0 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c  lSeq *pReq = sql
12c00 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
12c10 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
12c20 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20   pLhs, pRhs);.  
12c30 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b            int j;
12c40 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
12c50 61 73 73 65 72 74 28 20 70 52 65 71 21 3d 30 20  assert( pReq!=0 
12c60 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e  || pRhs->iColumn
12c70 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50  ==XN_ROWID || pP
12c80 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20  arse->nErr );.  
12c90 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
12ca0 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29  0; j<nExpr; j++)
12cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12cc0 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
12cd0 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f  mn[j]!=pRhs->iCo
12ce0 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
12cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
12d00 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43  ssert( pIdx->azC
12d10 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20  oll[j] );.      
12d20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 71          if( pReq
12d30 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
12d40 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d  rICmp(pReq->zNam
12d50 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  e, pIdx->azColl[
12d60 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  j])!=0 ){.      
12d70 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
12d80 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
12d90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
12da0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
12db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12dc0 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20     if( j==nExpr 
12dd0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
12de0 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b       mCol = MASK
12df0 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20  BIT(j);.        
12e00 20 20 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63      if( mCol & c
12e10 6f 6c 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20  olUsed ) break; 
12e20 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75  /* Each column u
12e30 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  sed only once */
12e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .            col
12e50 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20  Used |= mCol;.  
12e60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 69            if( ai
12e70 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d  Map ) aiMap[i] =
12e80 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   j;.          }.
12e90 20 20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73    .          ass
12ea0 65 72 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c  ert( i==nExpr ||
12eb0 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42   colUsed!=(MASKB
12ec0 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a  IT(nExpr)-1) );.
12ed0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6f            if( co
12ee0 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28  lUsed==(MASKBIT(
12ef0 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20  nExpr)-1) ){.   
12f00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
12f10 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
12f20 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  nt, that means t
12f30 68 65 20 69 6e 64 65 78 20 70 49 64 78 20 69 73  he index pIdx is
12f40 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20   usable */.     
12f50 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72         int iAddr
12f60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12f70 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
12f80 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
12f90 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
12fa0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
12fb0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12fc0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
12fd0 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30 2c 20 30  OP_Explain, 0, 0
12fe0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
12ff0 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
13000 66 28 64 62 2c 20 22 55 53 49 4e 47 20 49 4e 44  f(db, "USING IND
13010 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45  EX %s FOR IN-OPE
13020 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61  RATOR",pIdx->zNa
13030 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
13040 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a     P4_DYNAMIC);.
13050 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
13060 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13070 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
13080 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
13090 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
130a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
130b0 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
130c0 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
130d0 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
130e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
130f0 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
13100 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
13110 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
13120 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
13130 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
13140 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
13150 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
13160 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64  _INDEX_ASC + pId
13170 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
13180 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  ;.  .           
13190 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
131a0 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  l ){.#ifdef SQLI
131b0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
131c0 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20  _USED_MASK.     
131d0 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61 73           i64 mas
131e0 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d 31  k = (1<<nExpr)-1
131f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13200 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13210 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
13220 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20  mnsUsed, .      
13230 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
13240 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61  , 0, 0, (u8*)&ma
13250 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  sk, P4_INT64);.#
13260 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
13270 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c      *prRhsHasNul
13280 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
13290 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
132a0 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29    if( nExpr==1 )
132b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
132c0 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e    sqlite3SetHasN
132d0 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c  ullFlag(v, iTab,
132e0 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b   *prRhsHasNull);
132f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
13300 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
13310 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13320 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
13330 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
13340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
13350 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* End loop over
13360 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20 20   indexes */.    
13370 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 61    } /* End if( a
13380 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a  ffinity_ok ) */.
13390 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 20      } /* End if 
133a0 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e 64  not an rowid ind
133b0 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64  ex */.  } /* End
133c0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74 69   attempt to opti
133d0 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69 6e  mize using an in
133e0 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  dex */..  /* If 
133f0 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69  no preexisting i
13400 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c  ndex is availabl
13410 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61  e for the IN cla
13420 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f  use.  ** and IN_
13430 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e  INDEX_NOOP is an
13440 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20   allowed reply. 
13450 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
13460 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13470 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f  or is a list, no
13480 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a  t a subquery.  *
13490 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73  * and the RHS is
134a0 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72   not constant or
134b0 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65   has two or fewe
134c0 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68  r terms,.  ** th
134d0 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72  en it is not wor
134e0 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65  th creating an e
134f0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
13500 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20  o evaluate.  ** 
13510 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
13520 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  so return IN_IND
13530 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20  EX_NOOP..  */.  
13540 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20  if( eType==0.   
13550 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e  && (inFlags & IN
13560 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a  _INDEX_NOOP_OK).
13570 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
13580 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
13590 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28  sSelect).   && (
135a0 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43  !sqlite3InRhsIsC
135b0 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70  onstant(pX) || p
135c0 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  X->x.pList->nExp
135d0 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65  r<=2).  ){.    e
135e0 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
135f0 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
13600 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   eType==0 ){.   
13610 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69   /* Could not fi
13620 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  nd an existing t
13630 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
13640 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20   use as the RHS 
13650 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57  b-tree..    ** W
13660 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67  e will have to g
13670 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d  enerate an ephem
13680 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f  eral table to do
13690 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f   the job..    */
136a0 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e 51  .    u32 savedNQ
136b0 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
136c0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
136d0 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e     int rMayHaveN
136e0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79  ull = 0;.    eTy
136f0 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50  pe = IN_INDEX_EP
13700 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61  H;.    if( inFla
13710 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  gs & IN_INDEX_LO
13720 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  OP ){.      pPar
13730 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
13740 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58   0;.      if( pX
13750 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ->pLeft->iColumn
13760 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72  <0 && !ExprHasPr
13770 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
13780 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
13790 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
137a0 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NDEX_ROWID;.    
137b0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
137c0 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29  ( prRhsHasNull )
137d0 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48 61  {.      *prRhsHa
137e0 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65  sNull = rMayHave
137f0 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
13800 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  >nMem;.    }.   
13810 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
13820 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58  elect(pParse, pX
13830 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20  , rMayHaveNull, 
13840 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
13850 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72  ROWID);.    pPar
13860 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
13870 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
13880 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
13890 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  X->iTable = iTab
138a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d  ;.  }..  if( aiM
138b0 61 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f  ap && eType!=IN_
138c0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
138d0 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44  && eType!=IN_IND
138e0 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b  EX_INDEX_DESC ){
138f0 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
13900 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78     n = sqlite3Ex
13910 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d  prVectorSize(pX-
13920 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72  >pLeft);.    for
13930 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20  (i=0; i<n; i++) 
13940 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20  aiMap[i] = i;.  
13950 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
13960 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
13970 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13980 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41  SUBQUERY./*.** A
13990 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73  rgument pExpr is
139a0 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e   an (?, ?...) IN
139b0 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
139c0 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
139d0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
139e0 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d  d returns a nul-
139f0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
13a00 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a  g containing .**
13a10 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20   the affinities 
13a20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65  to be used for e
13a30 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
13a40 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a  e comparison..**
13a50 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
13a60 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
13a70 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
13a80 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
13a90 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67  turned.** string
13aa0 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
13ab0 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
13ac0 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  e3DbFree()..*/.s
13ad0 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72  tatic char *expr
13ae0 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  INAffinity(Parse
13af0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
13b00 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a  pExpr){.  Expr *
13b10 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
13b20 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  Left;.  int nVal
13b30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
13b40 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
13b50 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
13b60 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61  ct = (pExpr->fla
13b70 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
13b80 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53  t) ? pExpr->x.pS
13b90 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68 61  elect : 0;.  cha
13ba0 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65  r *zRet;..  asse
13bb0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
13bc0 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d  K_IN );.  zRet =
13bd0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
13be0 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
13bf0 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20   nVal+1);.  if( 
13c00 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  zRet ){.    int 
13c10 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
13c20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVal; i++){.  
13c30 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73      Expr *pA = s
13c40 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
13c50 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
13c60 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61  i);.      char a
13c70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
13c80 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20  finity(pA);.    
13c90 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
13ca0 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d  .        zRet[i]
13cb0 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
13cc0 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63  eAffinity(pSelec
13cd0 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
13ce0 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20  pExpr, a);.     
13cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13d00 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20  zRet[i] = a;.   
13d10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
13d20 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27  Ret[nVal] = '\0'
13d30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
13d40 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Ret;.}.#endif..#
13d50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13d60 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
13d70 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65  * Load the Parse
13d80 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
13d90 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
13da0 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72  ment with an err
13db0 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f  or .** message o
13dc0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
13dd0 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20  *   "sub-select 
13de0 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e  returns N column
13df0 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a  s - expected M".
13e00 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74  */   .void sqlit
13e10 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
13e20 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13e30 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74  int nActual, int
13e40 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e   nExpect){.  con
13e50 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20  st char *zFmt = 
13e60 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
13e70 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d  rns %d columns -
13e80 20 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20   expected %d";. 
13e90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13ea0 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e  (pParse, zFmt, n
13eb0 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29  Actual, nExpect)
13ec0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
13ed0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13ee0 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75  for scalar subqu
13ef0 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20  eries used as a 
13f00 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73  subquery express
13f10 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20  ion, EXISTS,.** 
13f20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e  or IN operators.
13f30 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
13f40 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20  *     (SELECT a 
13f50 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20  FROM b)         
13f60 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20   -- subquery.** 
13f70 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45      EXISTS (SELE
13f80 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d  CT a FROM b)   -
13f90 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72  - EXISTS subquer
13fa0 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34  y.**     x IN (4
13fb0 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20  ,5,11)          
13fc0 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
13fd0 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20  or with list on 
13fe0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a  right-hand side.
13ff0 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  **     x IN (SEL
14000 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
14010 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
14020 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f   with subquery o
14030 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a  n the right.**.*
14040 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61  * The pExpr para
14050 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20  meter describes 
14060 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
14070 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
14080 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20   IN.** operator 
14090 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  or subquery..**.
140a0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
140b0 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a  isRowid is non-z
140c0 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73  ero, then expres
140d0 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75  sion pExpr is gu
140e0 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
140f0 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  e of the form "<
14100 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c  rowid> IN (?, ?,
14110 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77   ?)", where <row
14120 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e  id> is a referen
14130 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e  ce.** to some in
14140 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e  teger key column
14150 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72   of a table B-Tr
14160 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
14170 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b  , use an.** intk
14180 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f  ey B-Tree to sto
14190 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e  re the set of IN
141a0 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73  (...) values ins
141b0 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
141c0 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61  l.** (slower) va
141d0 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65  riable length ke
141e0 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a  ys B-Tree..**.**
141f0 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   If rMayHaveNull
14200 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
14210 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
14220 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
14230 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53  n IN.** (not a S
14240 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29  ELECT or EXISTS)
14250 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48   and that the RH
14260 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73  S might contains
14270 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74   NULLs..** All t
14280 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
14290 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   is initialize t
142a0 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
142b0 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
142c0 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43  l.** to NULL.  C
142d0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  alling routines 
142e0 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f  will take care o
142f0 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
14300 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75  register.** valu
14310 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e to non-NULL if
14320 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c   the RHS is NULL
14330 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  -free..**.** For
14340 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
14350 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65  STS operator, re
14360 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
14370 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  r that holds the
14380 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  .** result.  For
14390 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20   a multi-column 
143a0 53 45 4c 45 43 54 2c 20 74 68 65 20 72 65 73 75  SELECT, the resu
143b0 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  lt is stored in 
143c0 61 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a 20  a contiguous.** 
143d0 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
143e0 72 73 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  rs and the retur
143f0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 72  n value is the r
14400 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 20 6c  egister of the l
14410 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73 75  eft-most.** resu
14420 6c 74 20 63 6f 6c 75 6d 6e 2e 20 20 52 65 74 75  lt column.  Retu
14430 72 6e 20 30 20 66 6f 72 20 49 4e 20 6f 70 65 72  rn 0 for IN oper
14440 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65  ators or if an e
14450 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
14460 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14470 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
14480 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
14490 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
144a0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
144b0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
144c0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
144d0 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
144e0 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45   /* The IN, SELE
144f0 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70  CT, or EXISTS op
14500 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
14510 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20  rHasNullFlag,   
14520 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
14530 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65  that records whe
14540 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74  ther NULLs exist
14550 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74   in RHS */.  int
14560 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20   isRowid        
14570 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
14580 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61   LHS of IN opera
14590 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a  tor is a rowid *
145a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66  /.){.  int jmpIf
145b0 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20  Dynamic = -1;   
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74     /* One-time t
145e0 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20  est address */. 
145f0 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20   int rReg = 0;  
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14610 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
14620 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73  ster storing res
14630 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65  ulting */.  Vdbe
14640 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
14650 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
14660 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
14670 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
14680 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
14690 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f  sh(pParse);..  /
146a0 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  * The evaluation
146b0 20 6f 66 20 74 68 65 20 49 4e 2f 45 58 49 53 54   of the IN/EXIST
146c0 53 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  S/SELECT must be
146d0 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79 20   repeated every 
146e0 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20  time it.  ** is 
146f0 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61  encountered if a
14700 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
14710 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
14720 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
14730 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
14740 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
14750 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
14760 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
14770 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
14780 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
14790 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
147a0 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
147b0 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
147c0 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
147d0 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
147e0 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
147f0 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
14800 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
14810 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
14820 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
14830 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
14840 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
14850 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
14860 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
14870 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
14880 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
14890 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e   ){.    jmpIfDyn
148a0 61 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 56 64  amic = sqlite3Vd
148b0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
148c0 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
148d0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  ge(v);.  }..#ifn
148e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
148f0 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50  EXPLAIN.  if( pP
14900 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
14910 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   ){.    char *zM
14920 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
14930 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
14940 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53 55  "EXECUTE %s%s SU
14950 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20  BQUERY %d",.    
14960 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63      jmpIfDynamic
14970 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  >=0?"":"CORRELAT
14980 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45  ED ",.        pE
14990 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22  xpr->op==TK_IN?"
149a0 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a  LIST":"SCALAR",.
149b0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
149c0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20  iNextSelectId.  
149d0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
149e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
149f0 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
14a00 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
14a10 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
14a20 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  MIC);.  }.#endif
14a30 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
14a40 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
14a50 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
14a60 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a80 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
14a90 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
14aa0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruction */.     
14ab0 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
14ac0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20  Expr->pLeft; /* 
14ad0 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
14ae0 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
14af0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
14b00 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
14b10 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
14b20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
14b30 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nVal;           
14b40 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
14b50 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20  of vector pLeft 
14b60 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  */.      .      
14b70 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  nVal = sqlite3Ex
14b80 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65  prVectorSize(pLe
14b90 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ft);.      asser
14ba0 74 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e  t( !isRowid || n
14bb0 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20  Val==1 );..     
14bc0 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
14bd0 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
14be0 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
14bf0 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
14c00 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
14c10 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
14c20 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
14c30 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20  .  An ephemeral 
14c40 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
14c50 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69  ** filled with i
14c60 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73  ndex keys repres
14c70 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c  enting the resul
14c80 74 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ts from the .   
14c90 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20     ** SELECT or 
14ca0 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a  the <exprlist>..
14cb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
14cc0 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70  * If the 'x' exp
14cd0 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
14ce0 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68  umn value, or th
14cf0 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20  e SELECT....    
14d00 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72    ** statement r
14d10 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20  eturns a column 
14d20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
14d30 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74  affinity of that
14d40 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
14d50 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
14d60 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73  d the index keys
14d70 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e  . If both 'x' an
14d80 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53  d the.      ** S
14d90 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
14da0 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
14db0 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
14dc0 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20  inity is used.  
14dd0 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72      ** if either
14de0 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45   column has NUME
14df0 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61  RIC or INTEGER a
14e00 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74  ffinity. If neit
14e10 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27  her.      ** 'x'
14e20 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e   nor the SELECT.
14e30 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
14e40 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
14e50 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a  umeric affinity.
14e60 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64        ** is used
14e70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14e80 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
14e90 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14ea0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
14eb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14ec0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
14ed0 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ral, .          
14ee0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28  pExpr->iTable, (
14ef0 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29  isRowid?0:nVal))
14f00 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
14f10 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a   = isRowid ? 0 :
14f20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
14f30 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
14f40 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20   nVal, 1);..    
14f50 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
14f60 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
14f70 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
14f80 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a        /* Case 1:
14f90 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
14fa0 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20  LECT ...).      
14fb0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
14fc0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14fd0 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
14fe0 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
14ff0 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72   into the tempor
15000 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ary.        ** t
15010 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  able allocated a
15020 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  nd opened above.
15030 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
15040 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
15050 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ect = pExpr->x.p
15060 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
15070 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
15080 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
15090 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73  st;..        ass
150a0 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b  ert( !isRowid );
150b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
150c0 68 65 20 4c 48 53 20 61 6e 64 20 52 48 53 20 6f  he LHS and RHS o
150d0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
150e0 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20  r do not match, 
150f0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
15100 65 72 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20  error will have 
15110 62 65 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67  been caught long
15120 20 62 65 66 6f 72 65 20 77 65 20 72 65 61 63 68   before we reach
15130 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a   this point. */.
15140 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41          if( ALWA
15150 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  YS(pEList->nExpr
15160 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  ==nVal) ){.     
15170 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
15180 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dest;.          
15190 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
151a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
151b0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
151c0 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
151d0 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  able);.         
151e0 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d   dest.zAffSdst =
151f0 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28   exprINAffinity(
15200 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
15210 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15220 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ( (pExpr->iTable
15230 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45  &0x0000FFFF)==pE
15240 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
15250 20 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74           pSelect
15260 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
15270 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
15280 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ( pSelect->selFl
15290 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
152a0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  t );.          t
152b0 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66  estcase( pKeyInf
152c0 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65  o==0 ); /* Cause
152d0 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69  d by OOM in sqli
152e0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
152f0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  ) */.          i
15300 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
15310 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
15320 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
15330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
15340 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
15350 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29  , dest.zAffSdst)
15360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
15370 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
15380 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  f(pKeyInfo);.   
15390 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
153a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
153b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
153c0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
153d0 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74  b, dest.zAffSdst
153e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
153f0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ert( pKeyInfo!=0
15400 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20   ); /* OOM will 
15410 63 61 75 73 65 20 65 78 69 74 20 61 66 74 65 72  cause exit after
15420 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
15430 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
15440 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
15450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
15460 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
15470 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  pr>0 );.        
15480 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15490 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
154a0 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b  ble(pKeyInfo) );
154b0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
154c0 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29  =0; i<nVal; i++)
154d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
154e0 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56  pr *p = sqlite3V
154f0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
15500 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
15510 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
15520 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  o->aColl[i] = sq
15530 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
15540 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20  reCollSeq(.     
15550 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
15560 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  e, p, pEList->a[
15570 69 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20  i].pExpr.       
15580 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
15590 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
155a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
155b0 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
155c0 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
155d0 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
155e0 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
155f0 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
15600 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65          ** For e
15610 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
15620 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
15630 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
15640 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
15650 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
15660 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
15670 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
15680 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
15690 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
156a0 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
156b0 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
156c0 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
156d0 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
156e0 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
156f0 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
15700 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
15710 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15720 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
15730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
15740 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48  finity of the LH
15750 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20  S of the IN */. 
15760 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
15770 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
15780 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
15790 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  .pList;.        
157a0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
157b0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
157c0 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c       int r1, r2,
157d0 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 61 66   r3;..        af
157e0 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
157f0 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
15800 66 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ft);.        if(
15810 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   !affinity ){.  
15820 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
15830 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
15840 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OB;.        }.  
15850 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
15860 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
15870 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
15880 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
15890 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
158a0 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
158b0 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  o->aColl[0] = sq
158c0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
158d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
158e0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
158f0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  }..        /* Lo
15900 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
15910 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65  expression in <e
15920 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20  xprlist>. */.   
15930 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
15940 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
15950 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  se);.        r2 
15960 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
15970 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
15980 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
15990 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
159a0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
159b0 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20   0, r2);.       
159c0 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45   for(i=pList->nE
159d0 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  xpr, pItem=pList
159e0 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
159f0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
15a00 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
15a10 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
15a20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54         int iValT
15a30 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20  oIns;..         
15a40 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65   /* If the expre
15a50 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e  ssion is not con
15a60 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69  stant then we wi
15a70 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ll need to.     
15a80 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
15a90 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
15aa0 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
15ab0 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
15ac0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
15ad0 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78  his code only ex
15ae0 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65  ecutes once.  Be
15af0 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d  cause for a non-
15b00 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20  constant.       
15b10 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
15b20 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75   we need to reru
15b30 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68  n this code each
15b40 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20   time..         
15b50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
15b60 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d  ( jmpIfDynamic>=
15b70 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
15b80 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
15b90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15ba0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
15bb0 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66  eToNoop(v, jmpIf
15bc0 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20 20  Dynamic);.      
15bd0 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d        jmpIfDynam
15be0 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ic = -1;.       
15bf0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
15c00 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
15c10 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69  expression and i
15c20 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
15c30 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  e temp table */.
15c40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
15c50 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65 33  Rowid && sqlite3
15c60 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
15c70 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29  2, &iValToIns) )
15c80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
15c90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15ca0 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c  v, OP_InsertInt,
15cb0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
15cc0 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a  r2, iValToIns);.
15cd0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
15ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33 20  .            r3 
15cf0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15d00 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
15d10 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  pE2, r1);.      
15d20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
15d30 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
15d40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15d50 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
15d60 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20  eInt, r3,.      
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15d90 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
15da0 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20  (v)+2);.        
15db0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
15dc0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
15dd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15de0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
15df0 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
15e00 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20  le, r2, r3);.   
15e10 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
15e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
15e30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
15e40 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
15e50 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66  , r3, 1, r2, &af
15e60 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
15e70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15e80 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
15e90 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
15ea0 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r3, 1);.       
15eb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15ec0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
15ed0 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78  P_IdxInsert, pEx
15ee0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
15ef0 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r3, 1);.        
15f00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15f10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
15f20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
15f30 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
15f40 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
15f50 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15f60 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
15f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15f80 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
15f90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15fa0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
15fb0 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65  ddr, (void *)pKe
15fc0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
15fd0 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
15fe0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
15ff0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
16000 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
16010 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61  SELECT:.    defa
16020 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
16030 43 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c 45  Case 3:    (SELE
16040 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29  CT ... FROM ...)
16050 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72  .      **     or
16060 3a 20 20 20 20 45 58 49 53 54 53 28 53 45 4c 45  :    EXISTS(SELE
16070 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29  CT ... FROM ...)
16080 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
16090 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c  ** For a SELECT,
160a0 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
160b0 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 73  o put the values
160c0 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73   for all columns
160d0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
160e0 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f 20   first row into 
160f0 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
16100 73 74 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e  sters and return
16110 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20 20   the index of.  
16120 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
16130 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20 20   register..     
16140 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
16150 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54  this is an EXIST
16160 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65  S, write an inte
16170 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74  ger 0 (not exist
16180 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29  s) or 1 (exists)
16190 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  .      ** into a
161a0 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 72 65   register and re
161b0 74 75 72 6e 20 74 68 61 74 20 72 65 67 69 73 74  turn that regist
161c0 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20  er number..     
161d0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20   **.      ** In 
161e0 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20  both cases, the 
161f0 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74  query is augment
16200 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31  ed with "LIMIT 1
16210 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a  ".  Any .      *
16220 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69  * preexisting li
16230 6d 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64  mit is discarded
16240 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65   in place of the
16250 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20   new LIMIT 1..  
16260 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c      */.      Sel
16270 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16290 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
162a0 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
162b0 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
162c0 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162e0 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77  /* How to deal w
162f0 69 74 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c  ith SELECT resul
16300 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
16310 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16330 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f   /* Registers to
16340 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20   allocate */..  
16350 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
16360 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
16370 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
16380 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
16390 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
163a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
163b0 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
163c0 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
163d0 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
163e0 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
163f0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
16400 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
16410 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  ;..      pSel = 
16420 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
16430 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70  ;.      nReg = p
16440 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
16450 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69  ECT ? pSel->pELi
16460 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20  st->nExpr : 1;. 
16470 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
16480 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
16490 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 0, pParse->nMe
164a0 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  m+1);.      pPar
164b0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
164c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
164d0 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
164e0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74   ){.        dest
164f0 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d  .eDest = SRT_Mem
16500 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69  ;.        dest.i
16510 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50  Sdst = dest.iSDP
16520 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73  arm;.        des
16530 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a  t.nSdst = nReg;.
16540 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16550 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16560 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53  Null, 0, dest.iS
16570 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50  DParm, dest.iSDP
16580 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20  arm+nReg-1);.   
16590 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
165a0 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
165b0 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
165c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
165d0 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
165e0 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
165f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16600 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
16610 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53  eger, 0, dest.iS
16620 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  DParm);.        
16630 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
16640 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
16650 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
16660 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16670 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
16680 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
16690 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  );.      pSel->p
166a0 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
166b0 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
166c0 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  >db, TK_INTEGER,
166d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
166e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166f0 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f     &sqlite3IntTo
16700 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20  kens[1], 0);.   
16710 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20     pSel->iLimit 
16720 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  = 0;.      pSel-
16730 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
16740 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20 20  _MultiValue;.   
16750 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
16760 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
16770 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  l, &dest) ){.   
16780 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
16790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65       }.      rRe
167a0 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  g = dest.iSDParm
167b0 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 56  ;.      ExprSetV
167c0 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
167d0 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
167e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
167f0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 48   }.  }..  if( rH
16800 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20  asNullFlag ){.  
16810 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e    sqlite3SetHasN
16820 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70 72  ullFlag(v, pExpr
16830 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e 75  ->iTable, rHasNu
16840 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20  llFlag);.  }..  
16850 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  if( jmpIfDynamic
16860 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
16870 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
16880 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b  , jmpIfDynamic);
16890 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
168a0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
168b0 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52  e);..  return rR
168c0 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  eg;.}.#endif /* 
168d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
168e0 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
168f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
16900 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72  QUERY./*.** Expr
16910 20 70 49 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e   pIn is an IN(..
16920 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54  .) expression. T
16930 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
16940 63 6b 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  cks that the .**
16950 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74   sub-select on t
16960 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
16970 28 29 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20  () operator has 
16980 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
16990 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61  of .** columns a
169a0 73 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20  s the vector on 
169b0 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20  the LHS. Or, if 
169c0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
169d0 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  N() is not .** a
169e0 20 73 75 62 2d 71 75 65 72 79 2c 20 74 68 61 74   sub-query, that
169f0 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 76 65   the LHS is a ve
16a00 63 74 6f 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a  ctor of size 1..
16a10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
16a20 70 72 43 68 65 63 6b 49 4e 28 50 61 72 73 65 20  prCheckIN(Parse 
16a30 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
16a40 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74  In){.  int nVect
16a50 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  or = sqlite3Expr
16a60 56 65 63 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e  VectorSize(pIn->
16a70 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 28 70  pLeft);.  if( (p
16a80 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  In->flags & EP_x
16a90 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
16aa0 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 70 49   if( nVector!=pI
16ab0 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  n->x.pSelect->pE
16ac0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
16ad0 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73       sqlite3Subs
16ae0 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
16af0 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63  e, pIn->x.pSelec
16b00 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
16b10 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
16b20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
16b30 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  }.  }else if( nV
16b40 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20  ector!=1 ){.    
16b50 69 66 28 20 28 70 49 6e 2d 3e 70 4c 65 66 74 2d  if( (pIn->pLeft-
16b60 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
16b70 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
16b80 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
16b90 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 56  Error(pParse, nV
16ba0 65 63 74 6f 72 2c 20 31 29 3b 0a 20 20 20 20 7d  ector, 1);.    }
16bb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
16bc0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16bd0 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
16be0 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 7d 0a  isused");.    }.
16bf0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
16c00 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
16c10 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
16c20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16c30 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
16c40 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
16c50 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
16c60 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
16c70 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
16c80 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
16c90 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
16ca0 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
16cb0 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
16cc0 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f   scalar or vecto
16cd0 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  r expression.  T
16ce0 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e  he .** right-han
16cf0 64 20 73 69 64 65 20 28 52 48 53 29 20 69 73 20  d side (RHS) is 
16d00 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
16d10 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20   or more scalar 
16d20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20  values, or a.** 
16d30 73 75 62 71 75 65 72 79 2e 20 20 49 66 20 74 68  subquery.  If th
16d40 65 20 52 48 53 20 69 73 20 61 20 73 75 62 71 75  e RHS is a subqu
16d50 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  ery, the number 
16d60 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
16d70 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20  s must.** match 
16d80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
16d90 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63  lumns in the vec
16da0 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
16db0 20 49 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a   If the RHS is.*
16dc0 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  * a list of valu
16dd0 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74  es, the LHS must
16de0 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a   be a scalar. .*
16df0 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72  *.** The IN oper
16e00 61 74 6f 72 20 69 73 20 74 72 75 65 20 69 66 20  ator is true if 
16e10 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73  the LHS value is
16e20 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
16e30 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68  n the RHS..** Th
16e40 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73  e result is fals
16e50 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
16e60 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69  definitely not i
16e70 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
16e80 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55  .** result is NU
16e90 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73 65 6e  LL if the presen
16ea0 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ce of the LHS in
16eb0 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20   the RHS cannot 
16ec0 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  be .** determine
16ed0 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a  d due to NULLs..
16ee0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16ef0 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
16f00 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  e that jumps to 
16f10 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
16f20 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
16f30 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
16f40 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
16f50 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
16f60 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
16f70 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
16f80 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
16f90 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
16fa0 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
16fb0 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
16fc0 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
16fd0 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
16fe0 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a  fall through..**
16ff0 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70 61  .** See the sepa
17000 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72  rate in-operator
17010 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .md documentatio
17020 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61  n file in the ca
17030 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74  nonical.** SQLit
17040 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f  e source tree fo
17050 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
17060 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
17070 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
17080 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61  ExprCodeIN(.  Pa
17090 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
170a0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
170b0 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
170c0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
170d0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
170e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
170f0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
17100 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c  int destIfFalse,
17110 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
17120 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74  re if LHS is not
17130 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
17140 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64  e RHS */.  int d
17150 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20  estIfNull       
17160 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
17170 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
17180 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20   unknown due to 
17190 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULLs */.){.  in
171a0 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  t rRhsHasNull = 
171b0 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  0;  /* Register 
171c0 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20  that is true if 
171d0 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
171e0 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  L values */.  in
171f0 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
17200 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
17210 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
17220 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  rLhs;           
17230 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29    /* Register(s)
17240 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53   holding the LHS
17250 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
17260 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20   rLhsOrig;      
17270 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73     /* LHS values
17280 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65   prior to reorde
17290 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20  ring by aiMap[] 
172a0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
172b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
172c0 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
172d0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
172e0 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20  int *aiMap = 0; 
172f0 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f        /* Map fro
17300 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74  m vector field t
17310 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a  o index column *
17320 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d  /.  char *zAff =
17330 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66   0;       /* Aff
17340 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72  inity string for
17350 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a   comparisons */.
17360 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20    int nVector;  
17370 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
17380 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74  of vectors for t
17390 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  his IN operator 
173a0 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b  */.  int iDummy;
173b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75             /* Du
173c0 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f  mmy parameter to
173d0 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
173e0 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  ) */.  Expr *pLe
173f0 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ft;          /* 
17400 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
17410 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
17420 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
17430 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f        /* loop co
17440 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64  unter */.  int d
17450 65 73 74 53 74 65 70 32 3b 20 20 20 20 20 20 20  estStep2;       
17460 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
17470 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65  p when NULLs see
17480 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20  n in step 2 */. 
17490 20 69 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d   int destStep6 =
174a0 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20   0;    /* Start 
174b0 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70  of code for Step
174c0 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
174d0 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a  TruthOp;      /*
174e0 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f   Address of opco
174f0 64 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  de that determin
17500 65 73 20 74 68 65 20 49 4e 20 69 73 20 74 72 75  es the IN is tru
17510 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e  e */.  int destN
17520 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20  otNull;      /* 
17530 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 20 63  Jump here if a c
17540 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
17550 20 74 72 75 65 20 69 6e 20 73 74 65 70 20 36 20   true in step 6 
17560 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
17570 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
17580 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20  p of the step-6 
17590 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66  loop */ ..  pLef
175a0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
175b0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
175c0 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73  xprCheckIN(pPars
175d0 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74 75  e, pExpr) ) retu
175e0 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70  rn;.  zAff = exp
175f0 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72  rINAffinity(pPar
17600 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56  se, pExpr);.  nV
17610 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45  ector = sqlite3E
17620 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
17630 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61  xpr->pLeft);.  a
17640 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c  iMap = (int*)sql
17650 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
17660 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  (.      pParse->
17670 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a  db, nVector*(siz
17680 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f  eof(int) + sizeo
17690 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29  f(char)) + 1.  )
176a0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
176b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
176c0 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45   ) goto sqlite3E
176d0 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72  xprCodeIN_oom_er
176e0 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d  ror;..  /* Attem
176f0 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  pt to compute th
17700 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69  e RHS. After thi
17710 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68  s step, if anyth
17720 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20  ing other than. 
17730 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   ** IN_INDEX_NOO
17740 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  P is returned, t
17750 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20  he table opened 
17760 69 74 68 20 63 75 72 73 6f 72 20 70 45 78 70 72  ith cursor pExpr
17770 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63  ->iTable .  ** c
17780 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
17790 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
177a0 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49  the RHS. If IN_I
177b0 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74  NDEX_NOOP is ret
177c0 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  urned,.  ** the 
177d0 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20  RHS has not yet 
177e0 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a  been coded.  */.
177f0 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
17800 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
17810 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
17820 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69  OOM detected pri
17830 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
17840 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  ne */.  VdbeNoop
17850 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
17860 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20  in IN expr"));. 
17870 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
17880 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
17890 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20  se, pExpr,.     
178a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178b0 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58          IN_INDEX
178c0 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e  _MEMBERSHIP | IN
178d0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a  _INDEX_NOOP_OK,.
178e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73               des
17900 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
17910 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73  Null ? 0 : &rRhs
17920 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b  HasNull, aiMap);
17930 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
17940 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63  se->nErr || nVec
17950 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d  tor==1 || eType=
17960 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20  =IN_INDEX_EPH.  
17970 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49       || eType==I
17980 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
17990 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  C || eType==IN_I
179a0 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
179b0 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  .  );.#ifdef SQL
179c0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43  ITE_DEBUG.  /* C
179d0 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69 4d 61  onfirm that aiMa
179e0 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65  p[] contains nVe
179f0 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c  ctor integer val
17a00 75 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ues between 0 an
17a10 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31  d.  ** nVector-1
17a20 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
17a30 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
17a40 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b  .    int j, cnt;
17a50 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30  .    for(cnt=j=0
17a60 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b  ; j<nVector; j++
17a70 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d  ) if( aiMap[j]==
17a80 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61  i ) cnt++;.    a
17a90 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b  ssert( cnt==1 );
17aa0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17ab0 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20  * Code the LHS, 
17ac0 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
17ad0 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
17ae0 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  ". If the LHS is
17af0 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c   a .  ** vector,
17b00 20 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72   then it is stor
17b10 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ed in an array o
17b20 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74  f nVector regist
17b30 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20  ers starting .  
17b40 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20  ** at r1..  **. 
17b50 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49   ** sqlite3FindI
17b60 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74 20 68  nIndex() might h
17b70 61 76 65 20 72 65 6f 72 64 65 72 65 64 20 74 68  ave reordered th
17b80 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
17b90 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20  LHS vector.  ** 
17ba0 73 6f 20 74 68 61 74 20 74 68 65 20 66 69 65 6c  so that the fiel
17bb0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 61  ds are in the sa
17bc0 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e 20 65  me order as an e
17bd0 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e 20 20  xisting index.  
17be0 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b   The.  ** aiMap[
17bf0 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
17c00 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20   a mapping from 
17c10 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53  the original LHS
17c20 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a   field order to.
17c30 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64 20 6f    ** the field o
17c40 72 64 65 72 20 74 68 61 74 20 6d 61 74 63 68 65  rder that matche
17c50 73 20 74 68 65 20 52 48 53 20 69 6e 64 65 78 2e  s the RHS index.
17c60 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
17c70 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
17c80 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72 69 67  rse);.  rLhsOrig
17c90 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f   = exprCodeVecto
17ca0 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
17cb0 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72   &iDummy);.  for
17cc0 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20  (i=0; i<nVector 
17cd0 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20  && aiMap[i]==i; 
17ce0 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48  i++){} /* Are LH
17cf0 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64 65 72  S fields reorder
17d00 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d  ed? */.  if( i==
17d10 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f  nVector ){.    /
17d20 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61 72 65  * LHS fields are
17d30 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64 20 2a   not reordered *
17d40 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72 4c 68  /.    rLhs = rLh
17d50 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  sOrig;.  }else{.
17d60 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
17d70 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53 20 66  eorder the LHS f
17d80 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e 67 20  ields according 
17d90 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20  to aiMap */.    
17da0 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 47 65  rLhs = sqlite3Ge
17db0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
17dc0 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  e, nVector);.   
17dd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
17de0 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tor; i++){.     
17df0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17e00 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
17e10 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b  LhsOrig+i, rLhs+
17e20 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20  aiMap[i], 0);.  
17e30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
17e40 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
17e50 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69  dex() did not fi
17e60 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20  nd or create an 
17e70 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20  index that is.  
17e80 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
17e90 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49  evaluating the I
17ea0 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e  N operator, then
17eb0 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20   evaluate using 
17ec0 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20  a.  ** sequence 
17ed0 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
17ee0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
17ef0 73 20 73 74 65 70 20 28 31 29 20 69 6e 20 74 68  s step (1) in th
17f00 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64  e in-operator.md
17f10 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72   optimized algor
17f20 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ithm..  */.  if(
17f30 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
17f40 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70  _NOOP ){.    Exp
17f50 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
17f60 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
17f70 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
17f80 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
17f90 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
17fa0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
17fb0 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20    int labelOk = 
17fc0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17fd0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74  abel(v);.    int
17fe0 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a   r2, regToFree;.
17ff0 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c      int regCkNul
18000 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
18010 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  i;.    assert( !
18020 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18030 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
18040 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
18050 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
18060 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
18070 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c   regCkNull = sql
18080 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
18090 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
180a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
180b0 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c  v, OP_BitAnd, rL
180c0 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e  hs, rLhs, regCkN
180d0 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ull);.    }.    
180e0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69  for(ii=0; ii<pLi
180f0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  st->nExpr; ii++)
18100 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  {.      r2 = sql
18110 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
18120 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
18130 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65  a[ii].pExpr, &re
18140 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  gToFree);.      
18150 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26  if( regCkNull &&
18160 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
18170 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69  eNull(pList->a[i
18180 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
18190 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
181a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74  AddOp3(v, OP_Bit
181b0 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  And, regCkNull, 
181c0 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  r2, regCkNull);.
181d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
181e0 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ( ii<pList->nExp
181f0 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c  r-1 || destIfNul
18200 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l!=destIfFalse )
18210 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18220 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18230 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65  P_Eq, rLhs, labe
18240 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lOk, r2,.       
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18260 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
18270 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
18280 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
18290 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74  geIf(v, ii<pList
182a0 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
182b0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
182c0 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d  If(v, ii==pList-
182d0 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
182e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
182f0 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30  angeP5(v, zAff[0
18300 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
18310 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18320 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
18330 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20  tIfFalse );.    
18340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18350 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp4(v, OP_Ne, 
18360 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73  rLhs, destIfFals
18370 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  e, r2,.         
18380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18390 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
183a0 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65  4_COLLSEQ); Vdbe
183b0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
183c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
183d0 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
183e0 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  [0] | SQLITE_JUM
183f0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
18400 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
18410 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
18420 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29  arse, regToFree)
18430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18440 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20  regCkNull ){.   
18450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18460 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
18470 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65  l, regCkNull, de
18480 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43  stIfNull); VdbeC
18490 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
184a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
184b0 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  o(v, destIfFalse
184c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
184d0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
184e0 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29  abel(v, labelOk)
184f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
18500 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18510 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  se, regCkNull);.
18520 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33      goto sqlite3
18530 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73  ExprCodeIN_finis
18540 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  hed;.  }..  /* S
18550 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20  tep 2: Check to 
18560 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 63  see if the LHS c
18570 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
18580 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68   columns.  If th
18590 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20  e.  ** LHS does 
185a0 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68  contain NULLs th
185b0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
185c0 73 74 20 62 65 20 65 69 74 68 65 72 20 46 41 4c  st be either FAL
185d0 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  SE or NULL..  **
185e0 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b   We will then sk
185f0 69 70 20 74 68 65 20 62 69 6e 61 72 79 20 73 65  ip the binary se
18600 61 72 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e  arch of the RHS.
18610 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
18620 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
18630 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53  lse ){.    destS
18640 74 65 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c  tep2 = destIfFal
18650 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  se;.  }else{.   
18660 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73   destStep2 = des
18670 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33  tStep6 = sqlite3
18680 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18690 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
186a0 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
186b0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
186c0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
186d0 6c 64 53 75 62 65 78 70 72 28 70 45 78 70 72 2d  ldSubexpr(pExpr-
186e0 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
186f0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
18700 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20  anBeNull(p) ){. 
18710 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18720 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
18730 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73  ull, rLhs+i, des
18740 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56  tStep2);.      V
18750 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18760 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18770 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53  Step 3.  The LHS
18780 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f   is now known to
18790 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44   be non-NULL.  D
187a0 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  o the binary sea
187b0 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  rch.  ** of the 
187c0 52 48 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48  RHS using the LH
187d0 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49  S as a probe.  I
187e0 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73  f found, the res
187f0 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65  ult is.  ** true
18800 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
18810 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
18820 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  ID ){.    /* In 
18830 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
18840 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  HS is the ROWID 
18850 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  of table b-tree 
18860 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20  and so we also. 
18870 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20     ** know that 
18880 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e  the RHS is non-N
18890 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20  ULL.  Hence, we 
188a0 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20  combine steps 3 
188b0 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74  and 4.    ** int
188c0 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  o a single opcod
188d0 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
188e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
188f0 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70 45 78  P_SeekRowid, pEx
18900 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
18910 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a  IfFalse, rLhs);.
18920 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
18930 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75  (v);.    addrTru
18940 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  thOp = sqlite3Vd
18950 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
18960 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e  oto);  /* Return
18970 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   True */.  }else
18980 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
18990 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66  eAddOp4(v, OP_Af
189a0 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56  finity, rLhs, nV
189b0 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20  ector, 0, zAff, 
189c0 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  nVector);.    if
189d0 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64  ( destIfFalse==d
189e0 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  estIfNull ){.   
189f0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74     /* Combine St
18a00 65 70 20 33 20 61 6e 64 20 53 74 65 70 20 35 20  ep 3 and Step 5 
18a10 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70  into a single op
18a20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  code */.      sq
18a30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
18a40 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
18a50 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
18a60 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20  , destIfFalse,. 
18a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a80 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20            rLhs, 
18a90 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f  nVector); VdbeCo
18aa0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
18ab0 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
18ac0 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
18ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f  ;.    }.    /* O
18ae0 72 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20  rdinary Step 3, 
18af0 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
18b00 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c  re FALSE and NUL
18b10 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a  L are distinct *
18b20 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f  /.    addrTruthO
18b30 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
18b40 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
18b50 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
18b60 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ble, 0,.        
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c                rL
18b90 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64  hs, nVector); Vd
18ba0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18bb0 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e   }..  /* Step 4.
18bc0 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20    If the RHS is 
18bd0 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d  known to be non-
18be0 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69 64 20  NULL and we did 
18bf0 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e  not find.  ** an
18c00 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20 73 65   match on the se
18c10 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68 65 6e  arch above, then
18c20 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   the result must
18c30 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a   be FALSE..  */.
18c40 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c    if( rRhsHasNul
18c50 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20  l && nVector==1 
18c60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
18c70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
18c80 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e  otNull, rRhsHasN
18c90 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ull, destIfFalse
18ca0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
18cb0 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
18cc0 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20 77 65  * Step 5.  If we
18cd0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
18ce0 75 74 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ut the differenc
18cf0 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61  e between NULL a
18d00 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74  nd.  ** FALSE, t
18d10 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
18d20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69  false. .  */.  i
18d30 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d  f( destIfFalse==
18d40 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c  destIfNull ) sql
18d50 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
18d60 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20  destIfFalse);.. 
18d70 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70   /* Step 6: Loop
18d80 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20 6f 66   through rows of
18d90 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d 70 61   the RHS.  Compa
18da0 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f 20 74  re each row to t
18db0 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20  he LHS..  ** If 
18dc0 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  any comparison i
18dd0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
18de0 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
18df0 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f    If all.  ** co
18e00 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20 46 41  mparisons are FA
18e10 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66 69 6e  LSE then the fin
18e20 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46 41 4c  al result is FAL
18e30 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  SE..  **.  ** Fo
18e40 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53 2c 20  r a scalar LHS, 
18e50 69 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  it is sufficient
18e60 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74 20 74   to check just t
18e70 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20 20 2a  he first row.  *
18e80 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20  * of the RHS..  
18e90 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53 74 65  */.  if( destSte
18ea0 70 36 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  p6 ) sqlite3Vdbe
18eb0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
18ec0 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20 61 64  destStep6);.  ad
18ed0 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
18ee0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18ef0 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69  Rewind, pExpr->i
18f00 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
18f10 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  se);.  VdbeCover
18f20 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56  age(v);.  if( nV
18f30 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64  ector>1 ){.    d
18f40 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c  estNotNull = sql
18f50 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18f60 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  l(v);.  }else{. 
18f70 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f     /* For nVecto
18f80 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74  r==1, combine st
18f90 65 70 73 20 36 20 61 6e 64 20 37 20 62 79 20 69  eps 6 and 7 by i
18fa0 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
18fb0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53  ning.    ** FALS
18fc0 45 20 69 66 20 74 68 65 20 66 69 72 73 74 20 63  E if the first c
18fd0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
18fe0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73   NULL */.    des
18ff0 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49  tNotNull = destI
19000 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f  fFalse;.  }.  fo
19010 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
19020 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
19030 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71   *p;.    CollSeq
19040 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74   *pColl;.    int
19050 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
19060 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
19070 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
19080 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
19090 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  pr(pLeft, i);.  
190a0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
190b0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
190c0 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c  rse, p);.    sql
190d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
190e0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78  , OP_Column, pEx
190f0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c 20 72  pr->iTable, i, r
19100 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
19110 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
19120 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74  Ne, rLhs+i, dest
19130 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20  NotNull, r3,.   
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19150 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
19160 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
19170 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
19180 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
19190 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
191a0 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20  rse, r3);.  }.  
191b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
191c0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
191d0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
191e0 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b  if( nVector>1 ){
191f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19200 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
19210 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20  destNotNull);.  
19220 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19230 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
19240 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61  pExpr->iTable, a
19250 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56  ddrTop+1);.    V
19260 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19270 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20  .    /* Step 7: 
19280 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
19290 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
192a0 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
192b0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
192c0 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71  false. */.    sq
192d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
192e0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
192f0 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d  estIfFalse);.  }
19300 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72  ..  /* Jumps her
19310 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  e in order to re
19320 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20  turn true. */.  
19330 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
19340 65 72 65 28 76 2c 20 61 64 64 72 54 72 75 74 68  ere(v, addrTruth
19350 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70  Op);..sqlite3Exp
19360 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64  rCodeIN_finished
19370 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c  :.  if( rLhs!=rL
19380 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33  hsOrig ) sqlite3
19390 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
193a0 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20  Parse, rLhs);.  
193b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
193c0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 56  Pop(pParse);.  V
193d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
193e0 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  end IN expr"));.
193f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
19400 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73  N_oom_error:.  s
19410 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
19420 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b  rse->db, aiMap);
19430 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
19440 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66  (pParse->db, zAf
19450 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  f);.}.#endif /* 
19460 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19470 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
19480 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
19490 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a  ATING_POINT./*.*
194a0 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
194b0 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
194c0 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61  ill put the floa
194d0 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
194e0 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79  lue described by
194f0 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
19500 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
19510 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
19520 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
19530 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
19540 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
19550 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
19560 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
19570 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
19580 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
19590 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
195a0 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
195b0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
195c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
195d0 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20  deReal(Vdbe *v, 
195e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
195f0 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69  nt negateFlag, i
19600 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20  nt iMem){.  if( 
19610 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a  ALWAYS(z!=0) ){.
19620 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
19630 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
19640 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c  F(z, &value, sql
19650 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
19660 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
19670 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69     assert( !sqli
19680 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20  te3IsNaN(value) 
19690 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74  ); /* The new At
196a0 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  oF never returns
196b0 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20   NaN */.    if( 
196c0 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c  negateFlag ) val
196d0 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
196e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
196f0 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61  p4Dup8(v, OP_Rea
19700 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  l, 0, iMem, 0, (
19710 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52  u8*)&value, P4_R
19720 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  EAL);.  }.}.#end
19730 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  if.../*.** Gener
19740 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
19750 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
19760 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
19770 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
19780 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
19790 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
197a0 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  *.** Expr.u.zTok
197b0 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46  en is always UTF
197c0 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69  8 and zero-termi
197d0 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nated..*/.static
197e0 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
197f0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
19800 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
19810 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
19820 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Mem){.  Vdbe *v 
19830 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19840 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
19850 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
19860 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  e ){.    int i =
19870 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
19880 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
19890 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  =0 );.    if( ne
198a0 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a  gFlag ) i = -i;.
198b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
198c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
198d0 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20  ger, i, iMem);. 
198e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
198f0 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65  c;.    i64 value
19900 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
19910 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a   *z = pExpr->u.z
19920 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  Token;.    asser
19930 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63  t( z!=0 );.    c
19940 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48   = sqlite3DecOrH
19950 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75  exToI64(z, &valu
19960 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 31  e);.    if( c==1
19970 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 21 6e 65   || (c==2 && !ne
19980 67 46 6c 61 67 29 20 7c 7c 20 28 6e 65 67 46 6c  gFlag) || (negFl
19990 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41  ag && value==SMA
199a0 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23  LLEST_INT64)){.#
199b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
199c0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
199d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
199e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
199f0 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65  oversized intege
19a00 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61  r: %s%s", negFla
19a10 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29  g ? "-" : "", z)
19a20 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20  ;.#else.#ifndef 
19a30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f  SQLITE_OMIT_HEX_
19a40 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69 66  INTEGER.      if
19a50 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
19a60 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20  mp(z,"0x",2)==0 
19a70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19a80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19a90 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20  e, "hex literal 
19aa0 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c 20  too big: %s%s", 
19ab0 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a  negFlag?"-":"",z
19ac0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
19ad0 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
19ae0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
19af0 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d  , z, negFlag, iM
19b00 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  em);.      }.#en
19b10 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
19b20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
19b30 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32   ){ value = c==2
19b40 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
19b50 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
19b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19b70 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
19b80 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20  Int64, 0, iMem, 
19b90 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
19ba0 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
19bb0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  .  }.}../*.** Er
19bc0 61 73 65 20 63 6f 6c 75 6d 6e 2d 63 61 63 68 65  ase column-cache
19bd0 20 65 6e 74 72 79 20 6e 75 6d 62 65 72 20 69 0a   entry number i.
19be0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
19bf0 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50  acheEntryClear(P
19c00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
19c10 74 20 69 29 7b 0a 20 20 69 66 28 20 70 50 61 72  t i){.  if( pPar
19c20 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
19c30 2e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20  .tempReg ){.    
19c40 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
19c50 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
19c60 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
19c70 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
19c80 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
19c90 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
19ca0 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
19cb0 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20  he[i].iReg;.    
19cc0 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  }.  }.  pParse->
19cd0 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 69  nColCache--;.  i
19ce0 66 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  f( i<pParse->nCo
19cf0 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20 70 50  lCache ){.    pP
19d00 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
19d10 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  i] = pParse->aCo
19d20 6c 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e  lCache[pParse->n
19d30 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 7d 0a 7d  ColCache];.  }.}
19d40 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  .../*.** Record 
19d50 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  in the column ca
19d60 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69  che that a parti
19d70 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f  cular column fro
19d80 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  m a.** particula
19d90 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65  r table is store
19da0 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d in a particula
19db0 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76  r register..*/.v
19dc0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
19dd0 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20  acheStore(Parse 
19de0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
19df0 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74  b, int iCol, int
19e00 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
19e10 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20  .  int minLru;. 
19e20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73   int idxLru;.  s
19e30 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
19e40 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73  *p;..  /* Unless
19e50 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   an error has oc
19e60 63 75 72 72 65 64 2c 20 72 65 67 69 73 74 65 72  curred, register
19e70 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77   numbers are alw
19e80 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f  ays positive. */
19e90 0a 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e  .  assert( iReg>
19ea0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
19eb0 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
19ec0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
19ed0 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
19ee0 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36  =-1 && iCol<3276
19ef0 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20  8 );  /* Finite 
19f00 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a  column numbers *
19f10 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49  /..  /* The SQLI
19f20 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66  TE_ColumnCache f
19f30 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65  lag disables the
19f40 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20   column cache.  
19f50 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a  This is used.  *
19f60 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e  * for testing on
19f70 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74  ly - to verify t
19f80 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79  hat SQLite alway
19f90 73 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20  s gets the same 
19fa0 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68  answer.  ** with
19fb0 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65   and without the
19fc0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
19fd0 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
19fe0 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70  zationDisabled(p
19ff0 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
1a000 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29  E_ColumnCache) )
1a010 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46   return;..  /* F
1a020 69 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79  irst replace any
1a030 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e   existing entry.
1a040 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
1a050 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68 65  lly, the way the
1a060 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73   column cache is
1a070 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c   currently used,
1a080 20 77 65 20 61 72 65 20 67 75 61 72 61 6e 74 65   we are guarante
1a090 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ed.  ** that the
1a0a0 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76   object will nev
1a0b0 65 72 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e  er already be in
1a0c0 20 63 61 63 68 65 2e 20 20 56 65 72 69 66 79 20   cache.  Verify 
1a0d0 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a  this guarantee..
1a0e0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45    */.#ifndef NDE
1a0f0 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  BUG.  for(i=0, p
1a100 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1a110 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
1a120 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
1a130 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1a140 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  p->iTable!=iTab 
1a150 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  || p->iColumn!=i
1a160 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Col );.  }.#endi
1a170 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  f..  /* If the c
1a180 61 63 68 65 20 69 73 20 61 6c 72 65 61 64 79 20  ache is already 
1a190 66 75 6c 6c 2c 20 64 65 6c 65 74 65 20 74 68 65  full, delete the
1a1a0 20 6c 65 61 73 74 20 72 65 63 65 6e 74 6c 79 20   least recently 
1a1b0 75 73 65 64 20 65 6e 74 72 79 20 2a 2f 0a 20 20  used entry */.  
1a1c0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  if( pParse->nCol
1a1d0 43 61 63 68 65 3e 3d 53 51 4c 49 54 45 5f 4e 5f  Cache>=SQLITE_N_
1a1e0 43 4f 4c 43 41 43 48 45 20 29 7b 0a 20 20 20 20  COLCACHE ){.    
1a1f0 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66  minLru = 0x7ffff
1a200 66 66 66 3b 0a 20 20 20 20 69 64 78 4c 72 75 20  fff;.    idxLru 
1a210 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = -1;.    for(i=
1a220 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1a230 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
1a240 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
1a250 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , p++){.      if
1a260 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20  ( p->lru<minLru 
1a270 29 7b 0a 20 20 20 20 20 20 20 20 69 64 78 4c 72  ){.        idxLr
1a280 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 6d  u = i;.        m
1a290 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a  inLru = p->lru;.
1a2a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a2b0 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
1a2c0 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d  ColCache[idxLru]
1a2d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a2e0 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
1a2f0 43 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43  Cache[pParse->nC
1a300 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20 20 7d 0a  olCache++];.  }.
1a310 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65  .  /* Add the ne
1a320 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 65  w entry to the e
1a330 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  nd of the cache 
1a340 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d  */.  p->iLevel =
1a350 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1a360 65 76 65 6c 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  evel;.  p->iTabl
1a370 65 20 3d 20 69 54 61 62 3b 0a 20 20 70 2d 3e 69  e = iTab;.  p->i
1a380 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
1a390 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
1a3a0 0a 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20  .  p->tempReg = 
1a3b0 30 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50  0;.  p->lru = pP
1a3c0 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
1a3d0 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  +;.}../*.** Indi
1a3e0 63 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74  cate that regist
1a3f0 65 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67  ers between iReg
1a400 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72  ..iReg+nReg-1 ar
1a410 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
1a420 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68  ten..** Purge th
1a430 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  e range of regis
1a440 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f  ters from the co
1a450 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76  lumn cache..*/.v
1a460 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1a470 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65  acheRemove(Parse
1a480 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1a490 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
1a4a0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68   int i = 0;.  wh
1a4b0 69 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e  ile( i<pParse->n
1a4c0 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20  ColCache ){.    
1a4d0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1a4e0 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61   *p = &pParse->a
1a4f0 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20  ColCache[i];.   
1a500 20 69 66 28 20 70 2d 3e 69 52 65 67 20 3e 3d 20   if( p->iReg >= 
1a510 69 52 65 67 20 26 26 20 70 2d 3e 69 52 65 67 20  iReg && p->iReg 
1a520 3c 20 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20  < iReg+nReg ){. 
1a530 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
1a540 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b  lear(pParse, i);
1a550 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a560 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    i++;.    }.  }
1a570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
1a580 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  er the current c
1a590 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74  olumn cache cont
1a5a0 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e  ext.  Any new en
1a5b0 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61  tries added.** a
1a5c0 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75  dded to the colu
1a5d0 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74  mn cache after t
1a5e0 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d  his call are rem
1a5f0 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  oved when the.**
1a600 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
1a610 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  op occurs..*/.vo
1a620 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1a630 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70  chePush(Parse *p
1a640 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
1a650 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b  ->iCacheLevel++;
1a660 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1a670 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1a680 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1a690 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1a6a0 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1a6b0 74 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e  tf("PUSH to %d\n
1a6c0 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
1a6d0 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
1a6e0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  dif.}../*.** Rem
1a6f0 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ove from the col
1a700 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e  umn cache any en
1a710 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  tries that were 
1a720 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a  added since the.
1a730 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ** the previous 
1a740 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1a750 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Push operation. 
1a760 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1a770 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20   restore.** the 
1a780 63 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61  cache to the sta
1a790 74 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69  te it was in pri
1a7a0 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
1a7b0 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64  nt Push..*/.void
1a7c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1a7d0 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
1a7e0 73 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30  se){.  int i = 0
1a7f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1a800 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e  se->iCacheLevel>
1a810 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =1 );.  pParse->
1a820 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23  iCacheLevel--;.#
1a830 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1a840 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
1a850 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1a860 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1a870 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1a880 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c  ("POP  to %d\n",
1a890 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1a8a0 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
1a8b0 66 0a 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61  f.  while( i<pPa
1a8c0 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29  rse->nColCache )
1a8d0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
1a8e0 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
1a8f0 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43  Level>pParse->iC
1a900 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20  acheLevel ){.   
1a910 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
1a920 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  ar(pParse, i);. 
1a930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a940 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  i++;.    }.  }.}
1a950 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63  ../*.** When a c
1a960 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  ached column is 
1a970 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72  reused, make sur
1a980 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73  e that its regis
1a990 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e  ter is.** no lon
1a9a0 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73  ger available as
1a9b0 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72   a temp register
1a9c0 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a  .  ticket #3879:
1a9d0 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72    that same.** r
1a9e0 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65  egister might be
1a9f0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e   in the cache in
1aa00 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
1aa10 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a  , so be sure to.
1aa20 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e  ** get them all.
1aa30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1aa40 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1aa50 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73  PinRegister(Pars
1aa60 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1aa70 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
1aa80 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1aa90 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
1aaa0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1aab0 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e  ache; i<pParse->
1aac0 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20  nColCache; i++, 
1aad0 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
1aae0 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
1aaf0 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
1ab00 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
1ab10 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1ab20 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61  de that will loa
1ab30 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  d into register 
1ab40 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74  regOut a value t
1ab50 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70  hat is.** approp
1ab60 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49  riate for the iI
1ab70 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20  dxCol-th column 
1ab80 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
1ab90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1aba0 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43  prCodeLoadIndexC
1abb0 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1abc0 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20  pParse,  /* The 
1abd0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1abe0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
1abf0 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  ,    /* The inde
1ac00 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69  x whose column i
1ac10 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  s to be loaded *
1ac20 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
1ac30 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1ac40 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  inting to a tabl
1ac50 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  e row */.  int i
1ac60 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68  IdxCol,    /* Th
1ac70 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1ac80 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64  index to be load
1ac90 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ed */.  int regO
1aca0 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  ut      /* Store
1acb0 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
1acc0 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  n value in this 
1acd0 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1ace0 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70   i16 iTabCol = p
1acf0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49  Idx->aiColumn[iI
1ad00 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54  dxCol];.  if( iT
1ad10 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29  abCol==XN_EXPR )
1ad20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
1ad30 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a  dx->aColExpr );.
1ad40 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1ad50 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70  ->aColExpr->nExp
1ad60 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20  r>iIdxCol );.   
1ad70 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1ad80 62 20 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 20  b = iTabCur;.   
1ad90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ada0 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 64  Copy(pParse, pId
1adb0 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69  x->aColExpr->a[i
1adc0 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72  IdxCol].pExpr, r
1add0 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  egOut);.  }else{
1ade0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1adf0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1ae00 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64  able(pParse->pVd
1ae10 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  be, pIdx->pTable
1ae20 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20  , iTabCur,.     
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1ae50 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  TabCol, regOut);
1ae60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1ae70 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1ae80 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1ae90 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
1aea0 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
1aeb0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1aec0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1aed0 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64  umnOfTable(.  Vd
1aee0 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a  be *v,        /*
1aef0 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20   The VDBE under 
1af00 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1af10 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
1af20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
1af30 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
1af40 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  lue */.  int iTa
1af50 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20  bCur,    /* The 
1af60 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f  table cursor.  O
1af70 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20  r the PK cursor 
1af80 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
1af90 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  D */.  int iCol,
1afa0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1afb0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f  of the column to
1afc0 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e   extract */.  in
1afd0 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
1afe0 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1aff0 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ue into this reg
1b000 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  ister */.){.  if
1b010 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c  ( iCol<0 || iCol
1b020 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
1b030 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b040 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
1b050 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67  id, iTabCur, reg
1b060 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
1b070 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69     int op = IsVi
1b080 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
1b090 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f  _VColumn : OP_Co
1b0a0 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20  lumn;.    int x 
1b0b0 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20  = iCol;.    if( 
1b0c0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
1b0d0 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
1b0e0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d  ab) ){.      x =
1b0f0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1b100 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72 69  Index(sqlite3Pri
1b110 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
1b120 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d  b), iCol);.    }
1b130 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b140 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54  AddOp3(v, op, iT
1b150 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74  abCur, x, regOut
1b160 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  );.  }.  if( iCo
1b170 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  l>=0 ){.    sqli
1b180 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
1b190 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20  (v, pTab, iCol, 
1b1a0 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  regOut);.  }.}..
1b1b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1b1c0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78  ode that will ex
1b1d0 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d  tract the iColum
1b1e0 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  n-th column from
1b1f0 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61  .** table pTab a
1b200 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  nd store the col
1b210 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72  umn value in a r
1b220 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20  egister. .**.** 
1b230 41 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  An effort is mad
1b240 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
1b250 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
1b260 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54  egister iReg.  T
1b270 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61  his.** is not ga
1b280 72 61 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74  ranteeed for Get
1b290 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72  Column() - the r
1b2a0 65 73 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f  esult can be sto
1b2b0 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65  red in.** any re
1b2c0 67 69 73 74 65 72 2e 20 20 42 75 74 20 74 68 65  gister.  But the
1b2d0 20 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61   result is guara
1b2e0 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e  nteed to land in
1b2f0 20 72 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a   register iReg.*
1b300 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54  * for GetColumnT
1b310 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  oReg()..**.** Th
1b320 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
1b330 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54  pen cursor to pT
1b340 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65  ab in iTable whe
1b350 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
1b360 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66  * is called.  If
1b370 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20   iColumn<0 then 
1b380 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
1b390 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20  d that extracts 
1b3a0 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  the rowid..*/.in
1b3b0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
1b3c0 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  eGetColumn(.  Pa
1b3d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
1b3e0 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1b3f0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1b400 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
1b410 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
1b420 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1b430 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
1b440 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
1b450 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
1b460 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1b470 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
1b480 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1b490 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1b4a0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
1b4b0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1b4c0 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f  t iReg,        /
1b4d0 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
1b4e0 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20  here */.  u8 p5 
1b4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35             /* P5
1b500 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f   value for OP_Co
1b510 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a  lumn + FLAGS */.
1b520 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1b530 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1b540 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1b550 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
1b560 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1b570 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1b580 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1b590 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  he; i++, p++){. 
1b5a0 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65     if( p->iTable
1b5b0 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69  ==iTable && p->i
1b5c0 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
1b5d0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  ){.      p->lru 
1b5e0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1b5f0 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Cnt++;.      sql
1b600 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
1b610 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
1b620 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20   p->iReg);.     
1b630 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b   return p->iReg;
1b640 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61  .    }.  }  .  a
1b650 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
1b660 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b670 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1b680 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
1b690 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
1b6a0 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20  ;.  if( p5 ){.  
1b6b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1b6c0 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
1b6d0 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71  }else{   .    sq
1b6e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1b6f0 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ore(pParse, iTab
1b700 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
1b710 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
1b720 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71   iReg;.}.void sq
1b730 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1b740 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50  ColumnToReg(.  P
1b750 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1b760 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
1b770 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
1b780 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
1b790 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
1b7a0 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1b7b0 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
1b7c0 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
1b7d0 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
1b7e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1b7f0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
1b800 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1b810 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1b820 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1b830 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
1b840 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20  nt iReg         
1b850 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
1b860 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1b870 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78  t r1 = sqlite3Ex
1b880 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1b890 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43  pParse, pTab, iC
1b8a0 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69  olumn, iTable, i
1b8b0 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  Reg, 0);.  if( r
1b8c0 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65  1!=iReg ) sqlite
1b8d0 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1b8e0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
1b8f0 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a  opy, r1, iReg);.
1b900 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  }.../*.** Clear 
1b910 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  all column cache
1b920 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69   entries..*/.voi
1b930 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1b940 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  heClear(Parse *p
1b950 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Parse){.  int i;
1b960 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
1b970 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
1b980 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1b990 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1b9a0 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1b9b0 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d  ("CLEAR\n");.  }
1b9c0 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
1b9d0 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  0; i<pParse->nCo
1b9e0 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20  lCache; i++){.  
1b9f0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
1ba00 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52  olCache[i].tempR
1ba10 65 67 0a 20 20 20 20 20 26 26 20 70 50 61 72 73  eg.     && pPars
1ba20 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
1ba30 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
1ba40 65 6d 70 52 65 67 29 0a 20 20 20 20 29 7b 0a 20  empReg).    ){. 
1ba50 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54        pParse->aT
1ba60 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
1ba70 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50 61  TempReg++] = pPa
1ba80 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1ba90 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ].iReg;.    }.  
1baa0 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  }.  pParse->nCol
1bab0 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Cache = 0;.}../*
1bac0 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66  .** Record the f
1bad0 61 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69  act that an affi
1bae0 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20  nity change has 
1baf0 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75  occurred on iCou
1bb00 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20  nt.** registers 
1bb10 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53  starting with iS
1bb20 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tart..*/.void sq
1bb30 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1bb40 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72  finityChange(Par
1bb50 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1bb60 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75  iStart, int iCou
1bb70 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  nt){.  sqlite3Ex
1bb80 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
1bb90 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43  arse, iStart, iC
1bba0 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ount);.}../*.** 
1bbb0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1bbc0 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72   move content fr
1bbd0 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72  om registers iFr
1bbe0 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d  om...iFrom+nReg-
1bbf0 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f  1.** over to iTo
1bc00 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65  ..iTo+nReg-1. Ke
1bc10 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ep the column ca
1bc20 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  che up-to-date..
1bc30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1bc40 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73  xprCodeMove(Pars
1bc50 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1bc60 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
1bc70 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65  nt nReg){.  asse
1bc80 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e  rt( iFrom>=iTo+n
1bc90 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65  Reg || iFrom+nRe
1bca0 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69  g<=iTo );.  sqli
1bcb0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50  te3VdbeAddOp3(pP
1bcc0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1bcd0 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f  Move, iFrom, iTo
1bce0 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74  , nReg);.  sqlit
1bcf0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1bd00 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c  e(pParse, iFrom,
1bd10 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64   nReg);.}..#if d
1bd20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1bd30 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
1bd40 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
1bd50 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
1bd60 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72  rn true if any r
1bd70 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72  egister in the r
1bd80 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20  ange iFrom..iTo 
1bd90 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69  (inclusive).** i
1bda0 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
1bdb0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  f the column cac
1bdc0 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  he..**.** This r
1bdd0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 77  outine is used w
1bde0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61  ithin assert() a
1bdf0 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61  nd testcase() ma
1be00 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64  cros only.** and
1be10 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
1be20 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69   in a normal bui
1be30 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ld..*/.static in
1be40 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  t usedAsColumnCa
1be50 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
1be60 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
1be70 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  t iTo){.  int i;
1be80 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1be90 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
1bea0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1beb0 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
1bec0 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1bed0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
1bee0 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
1bef0 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26   if( r>=iFrom &&
1bf00 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e   r<=iTo ) return
1bf10 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54   1;    /*NO_TEST
1bf20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1bf30 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
1bf40 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53  QLITE_DEBUG || S
1bf50 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
1bf60 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43  EST */.../*.** C
1bf70 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61 72 20  onvert a scalar 
1bf80 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1bf90 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  to a TK_REGISTER
1bfa0 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20   referencing.** 
1bfb0 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20  register iReg.  
1bfc0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1bfd0 65 6e 73 75 72 65 20 74 68 61 74 20 69 52 65 67  ensure that iReg
1bfe0 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
1bff0 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  s.** the correct
1c000 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 65   value for the e
1c010 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74  xpression..*/.st
1c020 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f  atic void exprTo
1c030 52 65 67 69 73 74 65 72 28 45 78 70 72 20 2a 70  Register(Expr *p
1c040 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70  , int iReg){.  p
1c050 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20  ->op2 = p->op;. 
1c060 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49   p->op = TK_REGI
1c070 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  STER;.  p->iTabl
1c080 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72  e = iReg;.  Expr
1c090 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c  ClearProperty(p,
1c0a0 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a   EP_Skip);.}../*
1c0b0 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 6e 20  .** Evaluate an 
1c0c0 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69 74 68  expression (eith
1c0d0 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61  er a vector or a
1c0e0 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
1c0f0 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a  on) and store.**
1c100 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 63   the result in c
1c110 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f  ontinguous tempo
1c120 72 61 72 79 20 72 65 67 69 73 74 65 72 73 2e 20  rary registers. 
1c130 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1c140 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  x of.** the firs
1c150 74 20 72 65 67 69 73 74 65 72 20 75 73 65 64 20  t register used 
1c160 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
1c170 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ult..**.** If th
1c180 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c  e returned resul
1c190 74 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  t register is a 
1c1a0 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c 61 72  temporary scalar
1c1b0 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74  , then also writ
1c1c0 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69 73 74  e.** that regist
1c1d0 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  er number into *
1c1e0 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49 66 20  piFreeable.  If 
1c1f0 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73  the returned res
1c200 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  ult register.** 
1c210 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
1c220 72 79 20 6f 72 20 69 66 20 74 68 65 20 65 78 70  ry or if the exp
1c230 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63  ression is a vec
1c240 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65 65 61  tor set *piFreea
1c250 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a  ble.** to 0..*/.
1c260 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
1c270 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73 65 20  odeVector(Parse 
1c280 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1c290 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61 62 6c  , int *piFreeabl
1c2a0 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73 75 6c  e){.  int iResul
1c2b0 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  t;.  int nResult
1c2c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
1c2d0 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20 69  ctorSize(p);.  i
1c2e0 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b  f( nResult==1 ){
1c2f0 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73  .    iResult = s
1c300 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1c310 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 69  mp(pParse, p, pi
1c320 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c  Freeable);.  }el
1c330 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65 65 61  se{.    *piFreea
1c340 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ble = 0;.    if(
1c350 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43   p->op==TK_SELEC
1c360 54 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73 75  T ){.      iResu
1c370 6c 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  lt = sqlite3Code
1c380 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
1c390 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , p, 0, 0);.    
1c3a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1c3b0 20 69 3b 0a 20 20 20 20 20 20 69 52 65 73 75 6c   i;.      iResul
1c3c0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
1c3d0 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  +1;.      pParse
1c3e0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
1c3f0 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  t;.      for(i=0
1c400 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b  ; i<nResult; i++
1c410 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1c420 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72  e3ExprCodeFactor
1c430 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  able(pParse, p->
1c440 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
1c450 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b  xpr, i+iResult);
1c460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c470 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73   }.  return iRes
1c480 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ult;.}.../*.** G
1c490 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
1c4a0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
1c4b0 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
1c4c0 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
1c4d0 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
1c4e0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
1c4f0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
1c500 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
1c510 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
1c520 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
1c530 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
1c540 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
1c550 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
1c560 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
1c570 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
1c580 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
1c590 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
1c5a0 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
1c5b0 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
1c5c0 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
1c5d0 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
1c5e0 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
1c5f0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
1c600 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
1c610 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
1c620 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
1c630 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
1c640 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
1c650 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1c660 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
1c670 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1c680 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1c690 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
1c6a0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
1c6b0 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
1c6c0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1c6d0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c6f0 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
1c700 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
1c710 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
1c720 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
1c730 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
1c740 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
1c750 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1c760 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
1c770 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
1c780 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
1c790 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
1c7a0 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
1c7b0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1c7c0 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1c7d0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1c7e0 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  */.  int r1, r2;
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c800 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
1c810 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
1c820 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20  Expr tempX;     
1c830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
1c840 70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  porary expressio
1c850 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n node */.  int 
1c860 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  p5 = 0;..  asser
1c870 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
1c880 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
1c890 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  Mem );.  if( v==
1c8a0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
1c8b0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1c8c0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1c8d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1c8e0 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1c8f0 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
1c900 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
1c910 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
1c920 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
1c930 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1c940 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
1c950 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
1c960 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
1c970 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1c980 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1c990 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
1c9a0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
1c9b0 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
1c9c0 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
1c9d0 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
1c9e0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
1c9f0 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
1ca00 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d      return pCol-
1ca10 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  >iMem;.      }el
1ca20 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
1ca30 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
1ca40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ca50 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1ca60 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
1ca70 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54  fo->sortingIdxPT
1ca80 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1cab0 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
1cac0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1cad0 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
1cae0 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
1caf0 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
1cb00 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
1cb10 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
1cb20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
1cb30 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  : {.      int iT
1cb40 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  ab = pExpr->iTab
1cb50 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54  le;.      if( iT
1cb60 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ab<0 ){.        
1cb70 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  if( pParse->ckBa
1cb80 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  se>0 ){.        
1cb90 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
1cba0 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
1cbb0 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69  s or inserting i
1cbc0 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65  nto partial inde
1cbd0 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  x */.          r
1cbe0 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f  eturn pExpr->iCo
1cbf0 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63  lumn + pParse->c
1cc00 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 7d  kBase;.        }
1cc10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1cc20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70  /* Coding an exp
1cc30 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
1cc40 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  part of an index
1cc50 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61   where column na
1cc60 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mes.          **
1cc70 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65   in the index re
1cc80 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65  fer to the table
1cc90 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e   to which the in
1cca0 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  dex belongs */. 
1ccb0 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20           iTab = 
1ccc0 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1ccd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cce0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1ccf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1cd00 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1cd10 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20  , pExpr->pTab,. 
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1cd40 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
1cd50 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
1cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd70 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1cd80 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20  ->op2);.    }.  
1cd90 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
1cda0 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49  R: {.      codeI
1cdb0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
1cdc0 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29  Expr, 0, target)
1cdd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1cde0 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66  arget;.    }.#if
1cdf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ce00 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1ce10 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
1ce20 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
1ce30 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1ce40 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1ce50 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1ce60 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78   codeReal(v, pEx
1ce70 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
1ce80 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1ce90 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1cea0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1ceb0 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
1cec0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ced0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1cee0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1cef0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71  lue) );.      sq
1cf00 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
1cf10 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70  ing(v, target, p
1cf20 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1cf30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1cf40 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rget;.    }.    
1cf50 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
1cf60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1cf70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1cf80 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
1cf90 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1cfa0 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  get;.    }.#ifnd
1cfb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
1cfc0 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
1cfd0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
1cfe0 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
1cff0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1d000 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  ;.      char *zB
1d010 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lob;.      asser
1d020 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1d030 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1d040 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1d050 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1d060 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27  u.zToken[0]=='x'
1d070 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   || pExpr->u.zTo
1d080 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  ken[0]=='X' );. 
1d090 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1d0a0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d  pr->u.zToken[1]=
1d0b0 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
1d0c0 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   = &pExpr->u.zTo
1d0d0 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20  ken[2];.      n 
1d0e0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1d0f0 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  0(z) - 1;.      
1d100 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c  assert( z[n]=='\
1d110 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f  '' );.      zBlo
1d120 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f  b = sqlite3HexTo
1d130 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65  Blob(sqlite3Vdbe
1d140 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Db(v), z, n);.  
1d150 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d160 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
1d170 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30  , n/2, target, 0
1d180 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41  , zBlob, P4_DYNA
1d190 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75  MIC);.      retu
1d1a0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1d1b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1d1c0 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
1d1d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1d1e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d1f0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1d200 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
1d210 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1d220 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ken!=0 );.      
1d230 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1d240 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b  .zToken[0]!=0 );
1d250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d260 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56  beAddOp2(v, OP_V
1d270 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  ariable, pExpr->
1d280 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  iColumn, target)
1d290 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
1d2a0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d  r->u.zToken[1]!=
1d2b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
1d2c0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1d2d0 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20  oken[0]=='?' .  
1d2e0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74             || st
1d2f0 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  rcmp(pExpr->u.zT
1d300 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a  oken, pParse->az
1d310 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Var[pExpr->iColu
1d320 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20  mn-1])==0 );.   
1d330 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d340 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
1d350 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45  pParse->azVar[pE
1d360 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c  xpr->iColumn-1],
1d370 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1d380 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1d390 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1d3a0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
1d3b0 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65  STER: {.      re
1d3c0 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54 61 62  turn pExpr->iTab
1d3d0 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  le;.    }.#ifnde
1d3e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
1d3f0 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ST.    case TK_C
1d400 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  AST: {.      /* 
1d410 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
1d420 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28  he form:   CAST(
1d430 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20  pLeft AS token) 
1d440 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  */.      inReg =
1d450 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d460 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1d470 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
1d480 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
1d490 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b  inReg!=target ){
1d4a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d4b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d4c0 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
1d4d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1d4e0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
1d4f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1d500 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d510 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67  v, OP_Cast, targ
1d520 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
1d530 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1d540 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
1d550 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1d560 20 30 29 29 3b 0a 20 20 20 20 20 20 74 65 73 74   0));.      test
1d570 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75  case( usedAsColu
1d580 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
1d590 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b  inReg, inReg) );
1d5a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1d5b0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1d5c0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e  hange(pParse, in
1d5d0 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 72  Reg, 1);.      r
1d5e0 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 20 20 20  eturn inReg;.   
1d5f0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1d600 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
1d610 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
1d620 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1d630 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  OT:.      op = (
1d640 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
1d650 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
1d660 20 20 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55    p5 = SQLITE_NU
1d670 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66  LLEQ;.      /* f
1d680 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all-through */. 
1d690 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
1d6a0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
1d6b0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
1d6c0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
1d6d0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
1d6e0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
1d6f0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
1d700 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
1d710 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
1d720 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
1d730 28 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20  (pLeft) ){.     
1d740 20 20 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d     codeVectorCom
1d750 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1d760 70 72 2c 20 74 61 72 67 65 74 2c 20 6f 70 2c 20  pr, target, op, 
1d770 70 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p5);.      }else
1d780 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
1d790 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1d7a0 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  mp(pParse, pLeft
1d7b0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1d7c0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1d7d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1d7e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1d7f0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1d800 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f  ;.        codeCo
1d810 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
1d820 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1d830 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1d840 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
1d850 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
1d860 32 20 7c 20 70 35 29 3b 0a 20 20 20 20 20 20 20  2 | p5);.       
1d870 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
1d880 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
1d890 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
1d8a0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1d8b0 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20  =OP_Lt);.       
1d8c0 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
1d8d0 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
1d8e0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
1d8f0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1d900 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20  =OP_Le);.       
1d910 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
1d920 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
1d930 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
1d940 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1d950 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 20  =OP_Gt);.       
1d960 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
1d970 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
1d980 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
1d990 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1d9a0 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 20  =OP_Ge);.       
1d9b0 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
1d9c0 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
1d9d0 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
1d9e0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1d9f0 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 20  =OP_Eq);.       
1da00 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
1da10 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
1da20 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65  op==OP_Ne); Vdbe
1da30 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1da40 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20  =OP_Ne);.       
1da50 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1da60 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1da70 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1da80 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1da90 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1daa0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1dab0 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  K_AND:.    case 
1dac0 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  TK_OR:.    case 
1dad0 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  TK_PLUS:.    cas
1dae0 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63  e TK_STAR:.    c
1daf0 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20  ase TK_MINUS:.  
1db00 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20    case TK_REM:. 
1db10 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
1db20 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  D:.    case TK_B
1db30 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  ITOR:.    case T
1db40 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73  K_SLASH:.    cas
1db50 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
1db60 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
1db70 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f   .    case TK_CO
1db80 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  NCAT: {.      as
1db90 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50  sert( TK_AND==OP
1dba0 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20  _And );         
1dbb0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1dbc0 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20  =TK_AND );.     
1dbd0 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d   assert( TK_OR==
1dbe0 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20  OP_Or );        
1dbf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dc00 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20  op==TK_OR );.   
1dc10 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c     assert( TK_PL
1dc20 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20  US==OP_Add );   
1dc30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1dc40 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b  ( op==TK_PLUS );
1dc50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1dc60 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74  K_MINUS==OP_Subt
1dc70 72 61 63 74 20 29 3b 20 20 20 20 20 74 65 73 74  ract );     test
1dc80 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e  case( op==TK_MIN
1dc90 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  US );.      asse
1dca0 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52  rt( TK_REM==OP_R
1dcb0 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20  emainder );     
1dcc0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1dcd0 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61  K_REM );.      a
1dce0 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44  ssert( TK_BITAND
1dcf0 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20  ==OP_BitAnd );  
1dd00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1dd10 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20  ==TK_BITAND );. 
1dd20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1dd30 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20  BITOR==OP_BitOr 
1dd40 29 3b 20 20 20 20 20 20 20 20 74 65 73 74 63 61  );        testca
1dd50 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52  se( op==TK_BITOR
1dd60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1dd70 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44  ( TK_SLASH==OP_D
1dd80 69 76 69 64 65 20 29 3b 20 20 20 20 20 20 20 74  ivide );       t
1dd90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1dda0 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61  SLASH );.      a
1ddb0 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54  ssert( TK_LSHIFT
1ddc0 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29  ==OP_ShiftLeft )
1ddd0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1dde0 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20  ==TK_LSHIFT );. 
1ddf0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1de00 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  RSHIFT==OP_Shift
1de10 52 69 67 68 74 20 29 3b 20 20 74 65 73 74 63 61  Right );  testca
1de20 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46  se( op==TK_RSHIF
1de30 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
1de40 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50  t( TK_CONCAT==OP
1de50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20  _Concat );      
1de60 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1de70 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20  _CONCAT );.     
1de80 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1de90 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1dea0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1deb0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1dec0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1ded0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1dee0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1def0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1df00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1df10 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c  ddOp3(v, op, r2,
1df20 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
1df30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1df40 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1df50 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1df60 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1df70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1df80 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
1df90 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  S: {.      Expr 
1dfa0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
1dfb0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73  pLeft;.      ass
1dfc0 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
1dfd0 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
1dfe0 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
1dff0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74  .        codeInt
1e000 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65  eger(pParse, pLe
1e010 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  ft, 1, target);.
1e020 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1e030 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53  arget;.#ifndef S
1e040 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1e050 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
1e060 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d  }else if( pLeft-
1e070 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
1e080 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e090 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e0a0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1e0b0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
1e0c0 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65   codeReal(v, pLe
1e0d0 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c  ft->u.zToken, 1,
1e0e0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e0f0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e100 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
1e110 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d  lse{.        tem
1e120 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47  pX.op = TK_INTEG
1e130 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  ER;.        temp
1e140 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74  X.flags = EP_Int
1e150 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  Value|EP_TokenOn
1e160 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  ly;.        temp
1e170 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a  X.u.iValue = 0;.
1e180 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1e190 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e1a0 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c  (pParse, &tempX,
1e1b0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1e1c0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1e1d0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e1e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e1f0 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ft, &regFree2);.
1e200 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e210 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1e220 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31  Subtract, r2, r1
1e230 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e240 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1e250 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1e260 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1e270 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e280 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
1e290 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
1e2a0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
1e2b0 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
1e2c0 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1e2d0 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b  op==TK_BITNOT );
1e2e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e2f0 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b  K_NOT==OP_Not );
1e300 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1e310 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b  e( op==TK_NOT );
1e320 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1e330 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e340 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e350 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1e360 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e370 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1e380 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e390 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
1e3a0 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  r1, inReg);.    
1e3b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e3c0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
1e3d0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
1e3e0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
1e3f0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
1e400 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
1e410 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20  L==OP_IsNull ); 
1e420 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e430 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
1e440 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1e450 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
1e460 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f  l ); testcase( o
1e470 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
1e480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e490 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1e4a0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
1e4b0 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  t);.      r1 = s
1e4c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e4d0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e4e0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1e4f0 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
1e500 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1e510 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
1e520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e530 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20  p1(v, op, r1);. 
1e540 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1e550 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
1e560 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
1e570 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1e580 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
1e590 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e5a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1e5b0 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74  teger, 0, target
1e5c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e5d0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1e5e0 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65  addr);.      bre
1e5f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1e600 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
1e610 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  ON: {.      AggI
1e620 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78  nfo *pInfo = pEx
1e630 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
1e640 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30      if( pInfo==0
1e650 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1e660 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e670 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1e680 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1e690 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1e6a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
1e6b0 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
1e6c0 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e  : %s()", pExpr->
1e6d0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1e6e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e6f0 72 65 74 75 72 6e 20 70 49 6e 66 6f 2d 3e 61 46  return pInfo->aF
1e700 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  unc[pExpr->iAgg]
1e710 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  .iMem;.      }. 
1e720 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e730 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  }.    case TK_FU
1e740 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
1e750 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b  ExprList *pFarg;
1e760 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1e770 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
1e780 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
1e790 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20  t nFarg;        
1e7a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e7b0 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
1e7c0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75  ents */.      Fu
1e7d0 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
1e7e0 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
1e7f0 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20  tion definition 
1e800 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20  object */.      
1e810 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
1e820 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
1e830 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
1e840 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d 61       u32 constMa
1e850 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d  sk = 0;     /* M
1e860 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ask of function 
1e870 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61  arguments that a
1e880 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20  re constant */. 
1e890 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1e8b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1e8c0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
1e8d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
1e8e0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1e8f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1e900 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
1e910 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  (db);      /* Th
1e920 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
1e930 75 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74  used by this dat
1e940 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
1e950 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1e960 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61  0;    /* A colla
1e970 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
1e980 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
1e990 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1e9a0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1e9b0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
1e9c0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1e9d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
1e9e0 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
1e9f0 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20     pFarg = 0;.  
1ea00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ea10 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72     pFarg = pExpr
1ea20 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
1ea30 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d   }.      nFarg =
1ea40 20 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e   pFarg ? pFarg->
1ea50 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20  nExpr : 0;.     
1ea60 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1ea70 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1ea80 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1ea90 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78  .      zId = pEx
1eaa0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1eab0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
1eac0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
1ead0 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65  b, zId, nFarg, e
1eae0 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53  nc, 0);.#ifdef S
1eaf0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b  QLITE_ENABLE_UNK
1eb00 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f  NOWN_SQL_FUNCTIO
1eb10 4e 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  N.      if( pDef
1eb20 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65  ==0 && pParse->e
1eb30 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
1eb40 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
1eb50 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
1eb60 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72   "unknown", nFar
1eb70 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  g, enc, 0);.    
1eb80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1eb90 20 69 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20   if( pDef==0 || 
1eba0 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21  pDef->xFinalize!
1ebb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1ebc0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1ebd0 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66  arse, "unknown f
1ebe0 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20  unction: %s()", 
1ebf0 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  zId);.        br
1ec00 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
1ec10 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61      /* Attempt a
1ec20 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e   direct implemen
1ec30 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  tation of the bu
1ec40 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28  ilt-in COALESCE(
1ec50 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49  ) and.      ** I
1ec60 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e  FNULL() function
1ec70 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20  s.  This avoids 
1ec80 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c  unnecessary eval
1ec90 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20  uation of.      
1eca0 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  ** arguments pas
1ecb0 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  t the first non-
1ecc0 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20  NULL argument.. 
1ecd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1ece0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
1ecf0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
1ed00 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20  COALESCE ){.    
1ed10 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65      int endCoale
1ed20 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  sce = sqlite3Vdb
1ed30 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1ed40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1ed50 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20  Farg>=2 );.     
1ed60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1ed70 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  de(pParse, pFarg
1ed80 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
1ed90 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66  rget);.        f
1eda0 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b  or(i=1; i<nFarg;
1edb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1edc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1edd0 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p2(v, OP_NotNull
1ede0 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61  , target, endCoa
1edf0 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
1ee00 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1ee10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1ee20 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
1ee30 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61 72 67  ove(pParse, targ
1ee40 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  et, 1);.        
1ee50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ee60 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1ee70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ee80 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1ee90 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
1eea0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1eeb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1eec0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1eed0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  se);.        }. 
1eee0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1eef0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1ef00 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
1ef10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1ef20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1ef30 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20   The UNLIKELY() 
1ef40 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1ef50 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74  -op.  The result
1ef60 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20   is the value.  
1ef70 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1ef80 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  rst argument..  
1ef90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1efa0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
1efb0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55   & SQLITE_FUNC_U
1efc0 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20  NLIKELY ){.     
1efd0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
1efe0 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72  >=1 );.        r
1eff0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
1f000 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1f010 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
1f020 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1f030 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
1f040 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b  or(i=0; i<nFarg;
1f050 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
1f060 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74  f( i<32 && sqlit
1f070 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1f080 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78  (pFarg->a[i].pEx
1f090 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
1f0a0 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31   testcase( i==31
1f0b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
1f0c0 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42  nstMask |= MASKB
1f0d0 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20  IT32(i);.       
1f0e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
1f0f0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1f100 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
1f110 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70  EDCOLL)!=0 && !p
1f120 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
1f130 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1f140 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1f150 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
1f160 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
1f170 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1f180 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20   if( pFarg ){.  
1f190 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d        if( constM
1f1a0 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ask ){.         
1f1b0 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d   r1 = pParse->nM
1f1c0 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  em+1;.          
1f1d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1f1e0 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d  nFarg;.        }
1f1f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f200 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
1f210 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1f220 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20   nFarg);.       
1f230 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
1f240 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20  or length() and 
1f250 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f  typeof() functio
1f260 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e  ns with a column
1f270 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20   argument,.     
1f280 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35     ** set the P5
1f290 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
1f2a0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  e OP_Column opco
1f2b0 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e  de to OPFLAG_LEN
1f2c0 47 54 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a  GTHARG.        *
1f2d0 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45  * or OPFLAG_TYPE
1f2e0 4f 46 41 52 47 20 72 65 73 70 65 63 74 69 76 65  OFARG respective
1f2f0 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ly, to avoid unn
1f300 65 63 65 73 73 61 72 79 20 64 61 74 61 0a 20 20  ecessary data.  
1f310 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67        ** loading
1f320 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1f330 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
1f340 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c  funcFlags & (SQL
1f350 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c  ITE_FUNC_LENGTH|
1f360 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
1f370 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  OF))!=0 ){.     
1f380 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a       u8 exprOp;.
1f390 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1f3a0 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
1f3b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f3c0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
1f3d0 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
1f3e0 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67    exprOp = pFarg
1f3f0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
1f400 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1f410 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  exprOp==TK_COLUM
1f420 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f  N || exprOp==TK_
1f430 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
1f440 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1f450 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45  ( SQLITE_FUNC_LE
1f460 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e  NGTH==OPFLAG_LEN
1f470 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
1f480 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
1f490 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
1f4a0 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  ==OPFLAG_TYPEOFA
1f4b0 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
1f4c0 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 66    testcase( pDef
1f4d0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50  ->funcFlags & OP
1f4e0 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
1f4f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ;.            pF
1f500 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
1f510 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20  >op2 = .        
1f520 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e            pDef->
1f530 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46  funcFlags & (OPF
1f540 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50  LAG_LENGTHARG|OP
1f550 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b  FLAG_TYPEOFARG);
1f560 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f570 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1f580 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f590 50 75 73 68 28 70 50 61 72 73 65 29 3b 20 20 20  Push(pParse);   
1f5a0 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32    /* Ticket 2ea2
1f5b0 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20  425d34be */.    
1f5c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f5d0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
1f5e0 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 30  se, pFarg, r1, 0
1f5f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f610 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55    SQLITE_ECEL_DU
1f620 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  P|SQLITE_ECEL_FA
1f630 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20 20 73  CTOR);.        s
1f640 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1f650 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  op(pParse);     
1f660 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34   /* Ticket 2ea24
1f670 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20  25d34be */.     
1f680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f690 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  r1 = 0;.      }.
1f6a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f6b0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1f6c0 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62  .      /* Possib
1f6d0 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20  ly overload the 
1f6e0 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20  function if the 
1f6f0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1f700 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72  s.      ** a vir
1f710 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d  tual table colum
1f720 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
1f730 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66    ** For infix f
1f740 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20  unctions (LIKE, 
1f750 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e  GLOB, REGEXP, an
1f760 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65  d MATCH) use the
1f770 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64  .      ** second
1f780 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74   argument, not t
1f790 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65  he first, as the
1f7a0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73   argument to tes
1f7b0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  t to.      ** se
1f7c0 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c  e if it is a col
1f7d0 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c  umn in a virtual
1f7e0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
1f7f0 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20   done because.  
1f800 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20      ** the left 
1f810 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78  operand of infix
1f820 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20   functions (the 
1f830 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20  operand we want 
1f840 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  to.      ** cont
1f850 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29  rol overloading)
1f860 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20   ends up as the 
1f870 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1f880 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
1f890 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65  function.  The e
1f8a0 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f  xpression "A glo
1f8b0 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65  b B" is equivale
1f8c0 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  nt to .      ** 
1f8d0 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20  "glob(B,A).  We 
1f8e0 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20  want to use the 
1f8f0 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  A in "A glob B" 
1f900 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a  to test.      **
1f910 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76   for function ov
1f920 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20  erloading.  But 
1f930 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72  we use the B ter
1f940 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22  m in "glob(B,A)"
1f950 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1f960 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26   if( nFarg>=2 &&
1f970 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
1f980 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29   EP_InfixFunc) )
1f990 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
1f9a0 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
1f9b0 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
1f9c0 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
1f9d0 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  arg->a[1].pExpr)
1f9e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1f9f0 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20  ( nFarg>0 ){.   
1fa00 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
1fa10 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
1fa20 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
1fa30 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
1fa40 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
1fa50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1fa60 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
1fa70 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1fa80 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
1fa90 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
1faa0 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
1fab0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
1fac0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fad0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
1fae0 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
1faf0 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
1fb00 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
1fb10 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1fb20 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1fb30 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 63 6f 6e 73  _Function0, cons
1fb40 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65  tMask, r1, targe
1fb50 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1fb60 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1fb70 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44  *)pDef, P4_FUNCD
1fb80 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EF);.      sqlit
1fb90 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1fba0 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20  , (u8)nFarg);.  
1fbb0 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 26 26      if( nFarg &&
1fbc0 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b   constMask==0 ){
1fbd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fbe0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1fbf0 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61  (pParse, r1, nFa
1fc00 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
1fc10 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1fc20 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1fc30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1fc40 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
1fc50 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
1fc60 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
1fc70 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
1fc80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1fc90 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
1fca0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fcb0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
1fcc0 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
1fcd0 4b 5f 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f  K_SELECT && (nCo
1fce0 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
1fcf0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
1fd00 78 70 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20  xpr)!=1 ){.     
1fd10 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
1fd20 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
1fd30 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20   nCol, 1);.     
1fd40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fd50 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6f  return sqlite3Co
1fd60 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
1fd70 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
1fd80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fd90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1fda0 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f   case TK_SELECT_
1fdb0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1fdc0 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
1fdd0 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ->iTable==0 ){. 
1fde0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
1fdf0 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71  eft->iTable = sq
1fe00 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
1fe10 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
1fe20 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a  ->pLeft, 0, 0);.
1fe30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1fe40 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  turn pExpr->pLef
1fe50 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70  t->iTable + pExp
1fe60 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
1fe70 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
1fe80 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
1fe90 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
1fea0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1feb0 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  (v);.      int d
1fec0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
1fed0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1fee0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
1fef0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ff00 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
1ff10 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
1ff20 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
1ff30 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1ff40 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e  IfFalse, destIfN
1ff50 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1ff60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ff70 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
1ff80 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
1ff90 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1ffa0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
1ffb0 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71  False);.      sq
1ffc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ffd0 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61  v, OP_AddImm, ta
1ffe0 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  rget, 0);.      
1fff0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
20000 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
20010 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65  fNull);.      re
20020 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
20030 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
20040 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
20050 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20  Y */...    /*.  
20060 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
20070 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
20080 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
20090 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
200a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
200b0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
200c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
200d0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
200e0 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
200f0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
20100 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
20110 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
20120 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
20130 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
20140 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
20150 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
20160 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78 70 72  EN: {.      expr
20170 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
20180 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
20190 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
201a0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
201b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
201c0 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65 20  _SPAN:.    case 
201d0 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20  TK_COLLATE: .   
201e0 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
201f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
20200 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
20210 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
20220 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
20230 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  t);.    }..    c
20240 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20  ase TK_TRIGGER: 
20250 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
20260 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54  e opcode is TK_T
20270 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65  RIGGER, then the
20280 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
20290 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20   reference.     
202a0 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20   ** to a column 
202b0 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20  in the new.* or 
202c0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
202d0 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  les available to
202e0 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65  .      ** trigge
202f0 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74  r programs. In t
20300 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54  his case Expr.iT
20310 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31  able is set to 1
20320 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a   for the.      *
20330 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  * new.* pseudo-t
20340 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74  able, or 0 for t
20350 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
20360 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c  table. Expr.iCol
20370 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  umn.      ** is 
20380 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  set to the colum
20390 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  n of the pseudo-
203a0 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f  table to read, o
203b0 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20  r to -1 to.     
203c0 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77   ** read the row
203d0 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  id field..      
203e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
203f0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d  expression is im
20400 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
20410 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f  an OP_Param opco
20420 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20  de. The p1.     
20430 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73   ** parameter is
20440 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e   set to 0 for an
20450 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72   old.rowid refer
20460 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31  ence, or to (i+1
20470 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  ).      ** to re
20480 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20  ference another 
20490 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c  column of the ol
204a0 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
204b0 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a  , where .      *
204c0 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78  * i is the index
204d0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
204e0 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20  For a new.rowid 
204f0 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73  reference, p1 is
20500 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f  .      ** set to
20510 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20   (n+1), where n 
20520 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
20530 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68   columns in each
20540 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20   pseudo-table.. 
20550 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65       ** For a re
20560 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f  ference to any o
20570 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ther column in t
20580 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  he new.* pseudo-
20590 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20  table, p1.      
205a0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b  ** is set to (n+
205b0 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e  2+i), where n an
205c0 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e  d i are as defin
205d0 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46  ed previously. F
205e0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d  or.      ** exam
205f0 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  ple, if the tabl
20600 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67  e on which trigg
20610 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69  ers are being fi
20620 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  red is.      ** 
20630 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20  declared as:.   
20640 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
20650 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
20660 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a  (a, b);.      **
20670 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70  .      ** Then p
20680 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  1 is interpreted
20690 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
206a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
206b0 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f   p1==0   ->    o
206c0 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d  ld.rowid     p1=
206d0 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72  =3   ->    new.r
206e0 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20  owid.      **   
206f0 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==1   ->    ol
20700 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.a         p1==
20710 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a  4   ->    new.a.
20720 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32        **   p1==2
20730 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20     ->    old.b  
20740 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d         p1==5   -
20750 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20  >    new.b      
20760 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
20770 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
20780 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
20790 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72    int p1 = pExpr
207a0 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62  ->iTable * (pTab
207b0 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20  ->nCol+1) + 1 + 
207c0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
207d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
207e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Expr->iTable==0 
207f0 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
20800 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==1 );.      ass
20810 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
20820 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72  umn>=-1 && pExpr
20830 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e  ->iColumn<pTab->
20840 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  nCol );.      as
20850 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65  sert( pTab->iPKe
20860 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43  y<0 || pExpr->iC
20870 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b  olumn!=pTab->iPK
20880 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ey );.      asse
20890 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c  rt( p1>=0 && p1<
208a0 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29  (pTab->nCol*2+2)
208b0 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74   );..      sqlit
208c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
208d0 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61  OP_Param, p1, ta
208e0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  rget);.      Vdb
208f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
20900 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20  .%s -> $%d",.   
20910 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61       (pExpr->iTa
20920 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f  ble ? "new" : "o
20930 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70  ld"),.        (p
20940 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
20950 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70  ? "rowid" : pExp
20960 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  r->pTab->aCol[pE
20970 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e  xpr->iColumn].zN
20980 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61  ame),.        ta
20990 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a  rget.      ));..
209a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
209b0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
209c0 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  NT.      /* If t
209d0 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45  he column has RE
209e0 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20  AL affinity, it 
209f0 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
20a00 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20   stored as an.  
20a10 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
20a20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  Use OP_RealAffin
20a30 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ity to make sure
20a40 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
20a50 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  al..      **.   
20a60 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
20a70 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32  F: R-60985-57662
20a80 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e   SQLite will con
20a90 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62  vert the value b
20aa0 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ack to.      ** 
20ab0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77  floating point w
20ac0 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69  hen extracting i
20ad0 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72  t from the recor
20ae0 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
20af0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
20b00 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54  =0 .       && pT
20b10 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
20b20 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
20b30 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
20b40 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  AL.      ){.    
20b50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20b60 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
20b70 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74  Affinity, target
20b80 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
20b90 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
20ba0 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
20bb0 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20  K_VECTOR: {.    
20bc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
20bd0 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
20be0 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
20bf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20c00 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
20c10 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
20c20 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
20c30 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
20c40 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
20c50 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
20c60 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
20c70 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
20c80 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
20c90 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
20ca0 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
20cb0 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
20cc0 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
20cd0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
20ce0 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
20cf0 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
20d00 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
20d10 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
20d20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
20d30 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
20d40 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
20d50 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
20d60 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
20d70 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
20d80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
20d90 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
20da0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
20db0 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
20dc0 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
20dd0 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t of pExpr->x.pL
20de0 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e  ist if pExpr->x.
20df0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a  pList->nExpr is.
20e00 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65      ** odd.  The
20e10 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
20e20 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d  nal.  If the num
20e30 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
20e40 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a  in x.pList.    *
20e50 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20  * is even, then 
20e60 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64  Y is omitted and
20e70 20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22   the "otherwise"
20e80 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
20e90 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e  .    ** Ei is in
20ea0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
20eb0 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20  [i*2] and Ri is 
20ec0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
20ed0 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20  i*2+1]..    **. 
20ee0 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74     ** The result
20ef0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
20f00 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72  on is the Ri for
20f10 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
20f20 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f  ing Ei,.    ** o
20f30 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
20f40 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68   matching Ei, th
20f50 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f  e ELSE term Y, o
20f60 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  r if there is.  
20f70 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72    ** no ELSE ter
20f80 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  m, NULL..    */.
20f90 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
20fa0 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45  ert( op==TK_CASE
20fb0 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
20fc0 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20fe0 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
20ff0 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
21000 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
21010 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
21020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
21030 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
21040 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
21050 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
21060 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
21070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
21080 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
21090 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
210a0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
210b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210c0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
210d0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
210e0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
210f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
21100 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
21110 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
21120 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
21130 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
21140 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
21150 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
21160 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
21170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21180 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
21190 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
211a0 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211c0 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73   /* The X expres
211d0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
211e0 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20  pr *pTest = 0;  
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21200 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41  /* X==Ei (form A
21210 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f  ) or just Ei (fo
21220 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56  rm B) */.      V
21230 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61  VA_ONLY( int iCa
21240 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  cheLevel = pPars
21250 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20  e->iCacheLevel; 
21260 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  )..      assert(
21270 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
21280 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
21290 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d  elect) && pExpr-
212a0 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20  >x.pList );.    
212b0 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
212c0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  x.pList->nExpr >
212d0 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
212e0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
212f0 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
21300 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
21310 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
21320 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
21330 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73      endLabel = s
21340 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
21350 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
21360 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  ( (pX = pExpr->p
21370 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
21380 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b      tempX = *pX;
21390 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
213a0 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
213b0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
213c0 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
213d0 74 65 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56  tempX, exprCodeV
213e0 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74  ector(pParse, &t
213f0 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
21400 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
21410 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
21420 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   );.        mems
21430 65 74 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30  et(&opCompare, 0
21440 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61  , sizeof(opCompa
21450 72 65 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  re));.        op
21460 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f  Compare.op = TK_
21470 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  EQ;.        opCo
21480 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74  mpare.pLeft = &t
21490 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54  empX;.        pT
214a0 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65  est = &opCompare
214b0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63  ;.        /* Tic
214c0 6b 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35  ket b351d95f9cd5
214d0 65 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35  ef17e9d9dbae18f5
214e0 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20  ca8611190001:.  
214f0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c        ** The val
21500 75 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d  ue in regFree1 m
21510 69 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65  ight get SCopy-e
21520 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20  d into the file 
21530 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20  result..        
21540 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  ** So make sure 
21550 74 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65  that the regFree
21560 31 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  1 register is no
21570 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68  t reused for oth
21580 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75  er.        ** pu
21590 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69  rposes and possi
215a0 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  bly overwritten.
215b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67    */.        reg
215c0 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20  Free1 = 0;.     
215d0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
215e0 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69  ; i<nExpr-1; i=i
215f0 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2){.        sql
21600 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
21610 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
21620 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20     if( pX ){.   
21630 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
21640 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Test!=0 );.     
21650 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
21660 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65  Right = aListele
21670 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  m[i].pExpr;.    
21680 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21690 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69       pTest = aLi
216a0 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
216b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
216c0 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71     nextCase = sq
216d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
216e0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  el(v);.        t
216f0 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e  estcase( pTest->
21700 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
21710 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21720 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
21730 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43  se, pTest, nextC
21740 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ase, SQLITE_JUMP
21750 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  IFNULL);.       
21760 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74   testcase( aList
21770 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d  elem[i+1].pExpr-
21780 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
21790 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
217a0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
217b0 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
217c0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
217d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
217e0 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c  VdbeGoto(v, endL
217f0 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  abel);.        s
21800 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
21810 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
21820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21830 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
21840 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
21850 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78  }.      if( (nEx
21860 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  pr&1)!=0 ){.    
21870 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21880 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
21890 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
218a0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
218b0 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70  , pEList->a[nExp
218c0 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  r-1].pExpr, targ
218d0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
218e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
218f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
21900 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
21910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21920 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
21930 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
21940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21950 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
21960 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
21970 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20  e->nErr>0 .     
21980 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
21990 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43  >iCacheLevel==iC
219a0 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20  acheLevel );.   
219b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
219c0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
219d0 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62  dLabel);.      b
219e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
219f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21a00 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65  TRIGGER.    case
21a10 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
21a20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
21a30 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52  ->affinity==OE_R
21a40 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20  ollback .       
21a50 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
21a60 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
21a70 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
21a80 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
21a90 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20  OE_Fail.        
21aa0 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
21ab0 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
21ac0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
21ad0 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72  if( !pParse->pTr
21ae0 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20  iggerTab ){.    
21af0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
21b00 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
21b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
21b30 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
21b40 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
21b50 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
21b60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
21b70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
21b80 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
21b90 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
21ba0 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
21bb0 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
21bc0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
21bd0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
21be0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
21bf0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69  alue) );.      i
21c00 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
21c10 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b  ty==OE_Ignore ){
21c20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21c30 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
21c40 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61          v, OP_Ha
21c50 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f  lt, SQLITE_OK, O
21c60 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78  E_Ignore, 0, pEx
21c70 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b  pr->u.zToken,0);
21c80 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
21c90 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
21ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
21cb0 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
21cc0 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c  aint(pParse, SQL
21cd0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
21ce0 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20  RIGGER,.        
21cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d00 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
21d10 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e  inity, pExpr->u.
21d20 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20  zToken, 0, 0);. 
21d30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72       }..      br
21d40 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
21d50 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  f.  }.  sqlite3R
21d60 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
21d70 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
21d80 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
21d90 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
21da0 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65   regFree2);.  re
21db0 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f  turn inReg;.}../
21dc0 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20  *.** Factor out 
21dd0 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20  the code of the 
21de0 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
21df0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69   to initializati
21e00 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  on time..*/.void
21e10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21e20 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20  AtInit(.  Parse 
21e30 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
21e40 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
21e50 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
21e60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
21e70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20  ression to code 
21e80 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e  when the VDBE in
21e90 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69  itializes */.  i
21ea0 6e 74 20 72 65 67 44 65 73 74 2c 20 20 20 20 20  nt regDest,     
21eb0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61   /* Store the va
21ec0 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
21ed0 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 75  ster */.  u8 reu
21ee0 73 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20 54  sable       /* T
21ef0 72 75 65 20 69 66 20 74 68 69 73 20 65 78 70 72  rue if this expr
21f00 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61 62  ession is reusab
21f10 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  le */.){.  ExprL
21f20 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  ist *p;.  assert
21f30 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
21f40 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d  pParse) );.  p =
21f50 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
21f60 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 73  xpr;.  pExpr = s
21f70 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
21f80 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
21f90 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   0);.  p = sqlit
21fa0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
21fb0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70  (pParse, p, pExp
21fc0 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  r);.  if( p ){. 
21fd0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
21fe0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
21ff0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  = &p->a[p->nExpr
22000 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  -1];.     pItem-
22010 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
22020 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20 20   = regDest;.    
22030 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
22040 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20 7d   = reusable;.  }
22050 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  .  pParse->pCons
22060 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  tExpr = p;.}../*
22070 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
22080 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  e to evaluate an
22090 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
220a0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
220b0 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69  s.** into a regi
220c0 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ster.  Return th
220d0 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
220e0 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75  r where the resu
220f0 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  lts.** are store
22100 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
22110 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
22120 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
22130 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61   that can be dea
22140 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65  llocated,.** the
22150 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62  n write its numb
22160 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20  er into *pReg.  
22170 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
22180 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a  gister is not.**
22190 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68   a temporary, th
221a0 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20  en set *pReg to 
221b0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  zero..**.** If p
221c0 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61  Expr is a consta
221d0 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
221e0 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65  utine might gene
221f0 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64  rate this.** cod
22200 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65  e to fill the re
22210 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e  gister in the in
22220 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63  itialization sec
22230 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56  tion of the.** V
22240 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20  DBE program, in 
22250 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20  order to factor 
22260 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76  it out of the ev
22270 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a  aluation loop..*
22280 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
22290 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20  rCodeTemp(Parse 
222a0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
222b0 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29  Expr, int *pReg)
222c0 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45  {.  int r2;.  pE
222d0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
222e0 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78  rSkipCollate(pEx
222f0 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74  pr);.  if( Const
22300 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
22310 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  .   && pExpr->op
22320 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20  !=TK_REGISTER.  
22330 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
22340 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
22350 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20  (pExpr).  ){.   
22360 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 70   ExprList *p = p
22370 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
22380 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  r;.    int i;.  
22390 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20    *pReg  = 0;.  
223a0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
223b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
223c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
223d0 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d      for(pItem=p-
223e0 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20  >a, i=p->nExpr; 
223f0 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d  i>0; pItem++, i-
22400 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -){.        if( 
22410 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
22420 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
22430 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
22440 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20  pr,pExpr,-1)==0 
22450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
22460 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f  urn pItem->u.iCo
22470 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20  nstExprReg;.    
22480 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22490 20 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b 70    }.    r2 = ++p
224a0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
224b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
224c0 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
224d0 45 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20 20  Expr, r2, 1);.  
224e0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
224f0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
22500 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
22510 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
22520 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
22530 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
22540 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31  ;.    if( r2==r1
22550 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20   ){.      *pReg 
22560 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = r1;.    }else{
22570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
22580 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
22590 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
225a0 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  *pReg = 0;.    }
225b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
225c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
225d0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
225e0 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
225f0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
22600 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
22610 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
22620 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
22630 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
22640 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
22650 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
22660 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  arget..*/.void s
22670 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
22680 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
22690 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
226a0 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
226b0 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
226c0 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
226d0 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
226e0 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
226f0 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
22700 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
22710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22720 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
22730 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
22740 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
22750 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22760 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
22770 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
22780 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
22790 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
227a0 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
227b0 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
227c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
227d0 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
227e0 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
227f0 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
22800 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22810 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
22820 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
22830 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
22840 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
22850 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74  Make a transient
22860 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
22870 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68  ion pExpr and th
22880 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67  en code it using
22890 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43  .** sqlite3ExprC
228a0 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75  ode().  This rou
228b0 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20  tine works just 
228c0 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
228d0 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74  Code().** except
228e0 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20   that the input 
228f0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75  expression is gu
22900 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75  aranteed to be u
22910 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
22920 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
22930 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61  eCopy(Parse *pPa
22940 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
22950 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
22960 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
22970 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78  Parse->db;.  pEx
22980 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
22990 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
229a0 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  );.  if( !db->ma
229b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c  llocFailed ) sql
229c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
229d0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
229e0 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  et);.  sqlite3Ex
229f0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
22a00 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  pr);.}../*.** Ge
22a10 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
22a20 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
22a30 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
22a40 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
22a50 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
22a60 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
22a70 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
22a80 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
22a90 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
22aa0 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68  r target.  If th
22ab0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
22ac0 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
22ad0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
22ae0 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63  ight choose to c
22af0 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ode the expressi
22b00 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61  on at initializa
22b10 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f  tion time..*/.vo
22b20 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
22b30 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72  deFactorable(Par
22b40 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
22b50 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
22b60 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72  get){.  if( pPar
22b70 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
22b80 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  r && sqlite3Expr
22b90 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
22ba0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
22bb0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
22bc0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
22bd0 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  rget, 0);.  }els
22be0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
22bf0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
22c00 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
22c10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
22c20 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65  rate code that e
22c30 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69 76  valuates the giv
22c40 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
22c50 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c  d puts the resul
22c60 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  t.** in register
22c70 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   target..**.** A
22c80 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  lso make a copy 
22c90 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
22ca0 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  n results into a
22cb0 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72  nother "cache" r
22cc0 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d  egister.** and m
22cd0 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73  odify the expres
22ce0 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65  sion so that the
22cf0 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
22d00 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74   evaluated,.** t
22d10 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
22d20 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65  opy of the cache
22d30 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
22d40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
22d50 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73   used for expres
22d60 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  sions that are u
22d70 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  sed multiple .**
22d80 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72   times.  They ar
22d90 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  e evaluated once
22da0 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73   and the results
22db0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
22dc0 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64  on.** are reused
22dd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22de0 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68  3ExprCodeAndCach
22df0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
22e00 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
22e10 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
22e20 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
22e30 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d  Vdbe;.  int iMem
22e40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
22e50 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  get>0 );.  asser
22e60 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
22e70 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73  _REGISTER );.  s
22e80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
22e90 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
22ea0 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20  rget);.  iMem = 
22eb0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
22ec0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22ed0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
22ee0 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20  target, iMem);. 
22ef0 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
22f00 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a  pExpr, iMem);.}.
22f10 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
22f20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
22f30 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
22f40 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
22f50 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
22f60 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f  ession list into
22f70 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
22f80 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
22f90 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a  ng at target..**
22fa0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
22fb0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
22fc0 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a  s evaluated..**.
22fd0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
22fe0 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76  EL_DUP flag prev
22ff0 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e  ents the argumen
23000 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ts from being.**
23010 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50   filled using OP
23020 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79  _SCopy.  OP_Copy
23030 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e   must be used in
23040 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stead..**.** The
23050 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
23060 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c  TOR argument all
23070 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ows constant arg
23080 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20  uments to be.** 
23090 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74  factored out int
230a0 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
230b0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
230c0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
230d0 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74   flag means that
230e0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
230f0 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a  the list with.**
23100 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e   ExprList.a[].u.
23110 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
23120 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
23130 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  n evaluated and 
23140 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67  stored.** in reg
23150 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65 67  isters at srcReg
23160 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c  , and so the val
23170 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64  ue can be copied
23180 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f 0a   from there..*/.
23190 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
231a0 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50  odeExprList(.  P
231b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
231c0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
231d0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
231e0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
231f0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
23200 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ist to be coded 
23210 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c  */.  int target,
23220 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
23230 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74   to write result
23240 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52 65  s */.  int srcRe
23250 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75  g,        /* Sou
23260 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69 66  rce registers if
23270 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
23280 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20   */.  u8 flags  
23290 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
232a0 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20  TE_ECEL_* flags 
232b0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
232c0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
232d0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  tem;.  int i, j,
232e0 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20   n;.  u8 copyOp 
232f0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23300 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50  E_ECEL_DUP) ? OP
23310 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79  _Copy : OP_SCopy
23320 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
23330 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
23340 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
23350 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  );.  assert( tar
23360 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  get>0 );.  asser
23370 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
23380 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72  !=0 );  /* Never
23390 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20 6f   gets this far o
233a0 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20  therwise */.  n 
233b0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
233c0 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74    if( !ConstFact
233d0 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66  orOk(pParse) ) f
233e0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
233f0 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66  ECEL_FACTOR;.  f
23400 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
23410 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  a, i=0; i<n; i++
23420 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
23430 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49  Expr *pExpr = pI
23440 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
23450 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
23460 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30  ITE_ECEL_REF)!=0
23470 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e   && (j = pItem->
23480 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
23490 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
234a0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
234b0 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20  CEL_OMITREF ){. 
234c0 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20         i--;.    
234d0 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
234e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
234f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23500 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63  v, copyOp, j+src
23510 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29  Reg-1, target+i)
23520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
23530 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
23540 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
23550 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74  TOR)!=0 && sqlit
23560 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
23570 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
23580 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23590 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
235a0 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 2c 20  Expr, target+i, 
235b0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
235c0 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d       int inReg =
235d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
235e0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
235f0 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b  Expr, target+i);
23600 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
23610 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20  !=target+i ){.  
23620 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
23630 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  p;.        if( c
23640 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20  opyOp==OP_Copy. 
23650 20 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d          && (pOp=
23660 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
23670 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65  (v, -1))->opcode
23680 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
23690 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f     && pOp->p1+pO
236a0 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20  p->p3+1==inReg. 
236b0 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
236c0 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61  p2+pOp->p3+1==ta
236d0 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29  rget+i.        )
236e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
236f0 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  >p3++;.        }
23700 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23710 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23720 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52  2(v, copyOp, inR
23730 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  eg, target+i);. 
23740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23750 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23760 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
23770 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
23780 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72  r a BETWEEN oper
23790 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78  ator..**.**    x
237a0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
237b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
237c0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
237d0 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79  o .**.**    x>=y
237e0 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20   AND x<=z.**.** 
237f0 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c  Code it as such,
23800 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
23810 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75  do the common su
23820 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65  bexpression.** e
23830 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e  limination of x.
23840 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70  .**.** The xJump
23850 49 66 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  If parameter det
23860 65 72 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a  ermines details:
23870 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20  .**.**    NULL: 
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23890 20 20 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c    Store the bool
238a0 65 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65  ean result in re
238b0 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71  g[dest].**    sq
238c0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 3a  lite3ExprIfTrue:
238d0 20 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65        Jump to de
238e0 73 74 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20  st if true.**   
238f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
23900 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f  lse:     Jump to
23910 20 64 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a   dest if false.*
23920 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e  *.** The jumpIfN
23930 75 6c 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73  ull parameter is
23940 20 69 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d   ignored if xJum
23950 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  pIf is NULL..*/.
23960 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
23970 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50  CodeBetween(.  P
23980 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
23990 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
239a0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
239b0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
239c0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
239d0 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78  * The BETWEEN ex
239e0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
239f0 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
23a00 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
23a10 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c  ion or storage l
23a20 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  ocation */.  voi
23a30 64 20 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65  d (*xJump)(Parse
23a40 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29  *,Expr*,int,int)
23a50 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74  , /* Action to t
23a60 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  ake */.  int jum
23a70 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61  pIfNull    /* Ta
23a80 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
23a90 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55  he BETWEEN is NU
23aa0 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65  LL */.){. Expr e
23ab0 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54  xprAnd;     /* T
23ac0 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
23ad0 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d  in  x>=y AND x<=
23ae0 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  z  */.  Expr com
23af0 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65  pLeft;    /* The
23b00 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a    x>=y  term */.
23b10 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
23b20 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a  ;   /* The  x<=z
23b30 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
23b40 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a   exprX;       /*
23b50 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72   The  x  subexpr
23b60 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
23b70 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a  regFree1 = 0; /*
23b80 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
23b90 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d  egister */...  m
23ba0 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c  emset(&compLeft,
23bb0 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
23bc0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d  );.  memset(&com
23bd0 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f  pRight, 0, sizeo
23be0 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73  f(Expr));.  mems
23bf0 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20  et(&exprAnd, 0, 
23c00 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a  sizeof(Expr));..
23c10 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
23c20 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
23c30 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
23c40 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45  );.  exprX = *pE
23c50 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78  xpr->pLeft;.  ex
23c60 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e  prAnd.op = TK_AN
23c70 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65  D;.  exprAnd.pLe
23c80 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a  ft = &compLeft;.
23c90 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74    exprAnd.pRight
23ca0 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20   = &compRight;. 
23cb0 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54   compLeft.op = T
23cc0 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  K_GE;.  compLeft
23cd0 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
23ce0 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67  .  compLeft.pRig
23cf0 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
23d00 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
23d10 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20  .  compRight.op 
23d20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52  = TK_LE;.  compR
23d30 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  ight.pLeft = &ex
23d40 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  prX;.  compRight
23d50 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
23d60 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
23d70 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65  Expr;.  exprToRe
23d80 67 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 65  gister(&exprX, e
23d90 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
23da0 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
23db0 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28  egFree1));.  if(
23dc0 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a   xJump ){.    xJ
23dd0 75 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  ump(pParse, &exp
23de0 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70  rAnd, dest, jump
23df0 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  IfNull);.  }else
23e00 7b 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68  {.    /* Mark th
23e10 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
23e20 62 65 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f  being from the O
23e30 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
23e40 65 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20  e of a join.    
23e50 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  ** so that the s
23e60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
23e70 72 67 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77  rget() routine w
23e80 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
23e90 74 6f 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69  to move.    ** i
23ea0 74 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65  t into the Parse
23eb0 2e 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74  .pConstExpr list
23ec0 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65  .  We should use
23ed0 20 61 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74   a new bit for t
23ee0 68 69 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  his,.    ** for 
23ef0 63 6c 61 72 69 74 79 2c 20 62 75 74 20 77 65 20  clarity, but we 
23f00 61 72 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20  are out of bits 
23f10 69 6e 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67  in the Expr.flag
23f20 73 20 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20  s field so we.  
23f30 20 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75    ** have to reu
23f40 73 65 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  se the EP_FromJo
23f50 69 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e  in bit.  Bummer.
23f60 20 2a 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c   */.    exprX.fl
23f70 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f  ags |= EP_FromJo
23f80 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  in;.    sqlite3E
23f90 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
23fa0 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
23fb0 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dest);.  }.  sql
23fc0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
23fd0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
23fe0 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75  ee1);..  /* Ensu
23ff0 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74  re adequate test
24000 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74   coverage */.  t
24010 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
24020 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
24030 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
24040 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
24050 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
24060 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
24070 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
24080 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
24090 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
240a0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
240b0 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
240c0 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
240d0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
240e0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
240f0 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
24100 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
24110 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
24120 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
24130 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
24140 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
24150 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
24160 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
24170 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
24180 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
24190 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
241a0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
241b0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
241c0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
241d0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
241e0 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
241f0 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
24200 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
24210 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
24220 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
24230 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
24240 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
24250 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
24260 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a   xJump==0 );.}..
24270 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
24280 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
24290 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
242a0 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
242b0 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
242c0 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
242d0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
242e0 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
242f0 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
24300 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
24310 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
24320 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
24330 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
24340 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
24350 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
24360 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
24370 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
24380 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
24390 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
243a0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
243b0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  L..**.** This co
243c0 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
243d0 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
243e0 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
243f0 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
24400 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
24410 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
24420 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
24430 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
24440 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
24450 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
24460 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
24470 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
24480 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
24490 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
244a0 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
244b0 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
244c0 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
244d0 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
244e0 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
244f0 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
24500 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
24510 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
24520 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
24530 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
24540 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
24550 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
24560 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
24570 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
24580 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
24590 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
245a0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
245b0 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
245c0 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
245d0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
245e0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
245f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
24600 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
24610 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e  =0) )     return
24620 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  ;  /* Existence 
24630 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
24640 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
24650 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
24660 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
24670 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e   No way this can
24680 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20   happen */.  op 
24690 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
246a0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
246b0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
246c0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
246d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
246e0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
246f0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
24700 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
24710 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
24720 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
24730 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49  >pLeft, d2,jumpI
24740 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
24750 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
24760 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
24770 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
24780 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
24790 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
247a0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
247b0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
247c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
247d0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
247e0 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
247f0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
24800 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
24810 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
24820 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
24830 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
24840 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
24850 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24860 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
24870 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
24880 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
24890 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
248a0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
248b0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
248c0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
248d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
248e0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
248f0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
24900 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
24910 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
24920 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
24930 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
24940 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
24950 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
24960 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24970 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
24980 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
24990 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
249a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
249b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
249c0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
249d0 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
249e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
249f0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
24a00 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
24a10 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
24a20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
24a30 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
24a40 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20     jumpIfNull = 
24a50 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
24a60 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
24a70 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  u */.    case TK
24a80 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
24a90 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
24aa0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
24ab0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
24ac0 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
24ad0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _EQ: {.      if(
24ae0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
24af0 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  ctor(pExpr->pLef
24b00 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c  t) ) goto defaul
24b10 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65  t_expr;.      te
24b20 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
24b30 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
24b40 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
24b50 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
24b60 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
24b70 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
24b80 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
24b90 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
24ba0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
24bb0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
24bc0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
24bd0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
24be0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
24bf0 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
24c00 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
24c10 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
24c20 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
24c30 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
24c40 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
24c50 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
24c60 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
24c70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
24c80 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
24c90 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
24ca0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
24cb0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
24cc0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
24cd0 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
24ce0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
24cf0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
24d00 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
24d10 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
24d20 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
24d30 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
24d40 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
24d50 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
24d60 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
24d70 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
24d80 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  (op==OP_Eq);.   
24d90 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
24da0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
24db0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
24dc0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
24dd0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
24de0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
24df0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
24e00 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
24e10 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
24e20 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
24e30 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  ase(op==OP_Ne);.
24e40 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
24e50 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
24e60 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
24e70 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
24e80 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
24e90 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
24ea0 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
24eb0 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
24ec0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
24ed0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
24ee0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24ef0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
24f00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24f10 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
24f20 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
24f30 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
24f40 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
24f50 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
24f60 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
24f70 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
24f80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
24f90 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
24fa0 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
24fb0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
24fc0 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
24fd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
24fe0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
24ff0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
25000 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
25010 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25020 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
25030 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
25040 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
25050 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
25060 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
25070 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
25080 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25090 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
250a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
250b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
250c0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
250d0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
250e0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
250f0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
25100 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
25110 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
25120 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e  rIfTrue, jumpIfN
25130 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
25140 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
25150 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
25160 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
25170 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
25180 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
25190 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
251a0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
251b0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
251c0 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73  jumpIfNull ? des
251d0 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b  t : destIfFalse;
251e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
251f0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
25200 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
25210 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
25220 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
25230 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
25240 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
25250 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
25260 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
25270 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25280 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
25290 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65  efault: {.    de
252a0 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20  fault_expr:.    
252b0 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
252c0 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
252d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
252e0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
252f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
25300 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
25310 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
25320 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20     /* No-op */. 
25330 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25340 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
25350 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
25360 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
25370 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
25380 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25390 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
253a0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
253b0 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  !=0);.        Vd
253c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
253d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
253e0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
253f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
25400 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
25410 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
25420 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
25430 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
25440 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
25450 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
25460 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
25470 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
25480 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a  Free2);  .}../*.
25490 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
254a0 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
254b0 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
254c0 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
254d0 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
254e0 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
254f0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
25500 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
25510 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
25520 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
25530 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
25540 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
25550 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
25560 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
25570 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
25580 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
25590 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
255a0 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45  IfNull is SQLITE
255b0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66  _JUMPIFNULL or f
255c0 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
255d0 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20  umpIfNull.** is 
255e0 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
255f0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
25600 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
25610 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
25620 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
25630 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
25640 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
25650 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
25660 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
25670 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
25680 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
25690 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
256a0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
256b0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
256c0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
256d0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
256e0 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  0) ) return; /* 
256f0 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
25700 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
25710 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ler */.  if( pEx
25720 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72  pr==0 )    retur
25730 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
25740 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
25750 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
25760 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
25770 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
25780 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
25790 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
257a0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
257b0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
257c0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
257d0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
257e0 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
257f0 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
25800 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
25810 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
25820 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
25830 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
25840 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
25850 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
25860 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
25870 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
25880 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
25890 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
258a0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
258b0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
258c0 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
258d0 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
258e0 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
258f0 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
25900 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
25910 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
25920 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
25930 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
25940 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
25950 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
25960 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
25970 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
25980 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
25990 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
259a0 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
259b0 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
259c0 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
259d0 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
259e0 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
259f0 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
25a00 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
25a10 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
25a20 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
25a30 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
25a40 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
25a50 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
25a60 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
25a70 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
25a80 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
25a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
25aa0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
25ab0 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
25ac0 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
25ad0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
25ae0 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
25af0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
25b00 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
25b10 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
25b20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
25b30 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
25b40 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
25b50 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
25b60 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
25b70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
25b80 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
25b90 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
25ba0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
25bb0 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
25bc0 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
25bd0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
25be0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
25bf0 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  D: {.      testc
25c00 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
25c10 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
25c20 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
25c30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
25c40 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
25c50 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
25c60 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
25c70 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
25c80 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
25c90 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
25ca0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
25cb0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
25cc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25cd0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
25ce0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
25cf0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
25d00 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
25d10 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
25d20 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
25d30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
25d40 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
25d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25d60 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
25d70 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
25d80 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  , jumpIfNull^SQL
25d90 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
25da0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25db0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
25dc0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
25dd0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
25de0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
25df0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
25e00 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
25e10 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
25e20 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
25e30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25e40 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
25e50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25e60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
25e70 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
25e80 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
25e90 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
25ea0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
25eb0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
25ec0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
25ed0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
25ee0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
25ef0 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
25f00 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
25f10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
25f20 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
25f30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
25f40 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
25f50 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
25f60 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d  op = (pExpr->op=
25f70 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20  =TK_IS) ? TK_NE 
25f80 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a  : TK_EQ;.      j
25f90 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49  umpIfNull = SQLI
25fa0 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
25fb0 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
25fc0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
25fd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
25fe0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
25ff0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
26000 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
26010 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
26020 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
26030 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
26040 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
26050 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78   goto default_ex
26060 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  pr;.      testca
26070 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
26080 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
26090 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
260a0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
260b0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
260c0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
260d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
260e0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
260f0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
26100 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
26110 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
26120 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
26130 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
26140 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
26150 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
26160 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26170 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
26180 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
26190 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
261a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
261b0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
261c0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
261d0 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
261e0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
261f0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26200 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
26210 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
26220 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
26230 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
26240 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
26250 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
26260 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
26270 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
26280 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
26290 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
262a0 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
262b0 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
262c0 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
262d0 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56  =OP_Eq);.      V
262e0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
262f0 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
26300 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
26310 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
26320 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26330 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
26340 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
26350 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
26360 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
26370 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
26380 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
26390 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
263a0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
263b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
263c0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
263d0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
263e0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
263f0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
26400 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
26410 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
26420 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
26430 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
26440 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
26450 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26460 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
26470 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
26480 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
26490 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
264a0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
264b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
264c0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
264d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
264e0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
264f0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
26500 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
26510 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65  LL );   VdbeCove
26520 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
26530 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
26540 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
26550 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62  _NOTNULL );  Vdb
26560 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26570 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
26580 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26590 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
265a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
265b0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
265c0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
265d0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
265e0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
265f0 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
26600 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
26610 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
26620 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e  IfFalse, jumpIfN
26630 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
26640 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
26650 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
26660 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
26670 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
26680 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a  ( jumpIfNull ){.
26690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
266a0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
266b0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
266c0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
266d0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
266e0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
266f0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
26700 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
26710 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
26720 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
26730 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  st, destIfNull);
26740 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26750 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
26760 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
26770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
26780 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
26790 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
267a0 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78  {.    default_ex
267b0 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65  pr: .      if( e
267c0 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
267d0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
267e0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
267f0 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
26800 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
26810 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
26820 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e   ){.        /* n
26830 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
26840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
26850 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
26860 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
26870 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
26880 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26890 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
268a0 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74  _IfNot, r1, dest
268b0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
268c0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
268d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
268e0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
268f0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
26900 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26910 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
26930 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
26940 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
26950 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
26960 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
26970 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
26980 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
26990 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b  2);.}../*.** Lik
269a0 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  e sqlite3ExprIfF
269b0 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68  alse() except th
269c0 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64  at a copy is mad
269d0 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72  e of pExpr befor
269e0 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61  e.** code genera
269f0 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63  tion, and that c
26a00 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61  opy is deleted a
26a10 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61  fter code genera
26a20 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e  tion. This.** en
26a30 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f  sures that the o
26a40 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73  riginal pExpr is
26a50 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76   unchanged..*/.v
26a60 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
26a70 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20  fFalseDup(Parse 
26a80 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
26a90 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69  Expr, int dest,i
26aa0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
26ab0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
26ac0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
26ad0 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69  pr *pCopy = sqli
26ae0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
26af0 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
26b00 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
26b10 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
26b20 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
26b30 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73  arse, pCopy, des
26b40 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26b50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
26b60 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70  rDelete(db, pCop
26b70 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f  y);.}.../*.** Do
26b80 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
26b90 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
26ba0 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
26bb0 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
26bc0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
26bd0 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  are completely i
26be0 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72  dentical.  Retur
26bf0 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66  n 1 if they diff
26c00 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20  er only.** by a 
26c10 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
26c20 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65   at the top leve
26c30 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20  l.  Return 2 if 
26c40 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
26c50 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74  ences.** other t
26c60 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  han the top-leve
26c70 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  l COLLATE operat
26c80 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  or..**.** If any
26c90 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
26ca0 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
26cb0 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
26cc0 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
26cd0 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
26ce0 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
26cf0 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
26d00 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
26d10 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iTab..**.** The 
26d20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65  pA side might be
26d30 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
26d40 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  ER.  If that is 
26d50 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20  the case and pB 
26d60 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20  is.** not using 
26d70 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20  TK_REGISTER but 
26d80 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75  is otherwise equ
26d90 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74  ivalent, then st
26da0 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ill return 0..**
26db0 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  .** Sometimes th
26dc0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
26dd0 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66  return 2 even if
26de0 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
26df0 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
26e00 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
26e10 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
26e20 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
26e30 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
26e40 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
26e50 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65  urn 2 just to be
26e60 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
26e70 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
26e80 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f  turns 2, then yo
26e90 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
26ea0 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
26eb0 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
26ec0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
26ed0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
26ee0 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20   you get a 0 or 
26ef0 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  1 return, then y
26f00 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
26f10 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
26f20 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
26f30 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
26f40 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
26f50 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
26f60 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
26f70 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32  o get an extra 2
26f80 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20   - that.** just 
26f90 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
26fa0 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c  some slightly sl
26fb0 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20  ower code.  But 
26fc0 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20  returning.** an 
26fd0 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31  incorrect 0 or 1
26fe0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
26ff0 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f   malfunction..*/
27000 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
27010 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
27020 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
27030 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d  iTab){.  u32 com
27040 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66  binedFlags;.  if
27050 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
27060 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
27070 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
27080 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61   }.  combinedFla
27090 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c  gs = pA->flags |
270a0 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66   pB->flags;.  if
270b0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
270c0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
270d0 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  .    if( (pA->fl
270e0 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50  ags&pB->flags&EP
270f0 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26  _IntValue)!=0 &&
27100 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70   pA->u.iValue==p
27110 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
27120 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
27130 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
27140 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
27150 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20  >op!=pB->op ){. 
27160 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
27170 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
27180 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
27190 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69  pA->pLeft, pB, i
271a0 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
271b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
271c0 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d      if( pB->op==
271d0 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
271e0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
271f0 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20  (pA, pB->pLeft, 
27200 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
27210 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
27220 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
27230 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
27240 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
27250 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
27260 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f  UMN && pA->u.zTo
27270 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ken ){.    if( p
27280 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  A->op==TK_FUNCTI
27290 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ON ){.      if( 
272a0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
272b0 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
272c0 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72  u.zToken)!=0 ) r
272d0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c  eturn 2;.    }el
272e0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41  se if( strcmp(pA
272f0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
27300 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20  .zToken)!=0 ){. 
27310 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e       return pA->
27320 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f  op==TK_COLLATE ?
27330 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20   1 : 2;.    }.  
27340 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  }.  if( (pA->fla
27350 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
27360 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
27370 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72  EP_Distinct) ) r
27380 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41  eturn 2;.  if( A
27390 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46  LWAYS((combinedF
273a0 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f  lags & EP_TokenO
273b0 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nly)==0) ){.    
273c0 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
273d0 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
273e0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
273f0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
27400 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66  Compare(pA->pLef
27410 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  t, pB->pLeft, iT
27420 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
27430 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
27440 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
27450 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
27460 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
27470 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
27480 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
27490 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c  are(pA->x.pList,
274a0 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54   pB->x.pList, iT
274b0 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
274c0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 28      if( ALWAYS((
274d0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
274e0 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20  EP_Reduced)==0) 
274f0 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54  && pA->op!=TK_ST
27500 52 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66  RING ){.      if
27510 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  ( pA->iColumn!=p
27520 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
27530 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28  urn 2;.      if(
27540 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
27550 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20  >iTable .       
27560 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d  && (pA->iTable!=
27570 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42  iTab || NEVER(pB
27580 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20  ->iTable>=0)) ) 
27590 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
275a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
275b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
275c0 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
275d0 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
275e0 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
275f0 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
27600 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
27610 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
27620 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
27630 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
27640 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
27650 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
27660 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
27670 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
27680 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
27690 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
276a0 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
276b0 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Tab..**.** This 
276c0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
276d0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
276e0 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
276f0 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
27700 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
27710 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
27720 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
27730 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
27740 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
27750 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
27760 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
27770 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
27780 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
27790 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
277a0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
277b0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
277c0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
277d0 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
277e0 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
277f0 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
27800 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
27810 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
27820 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
27830 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
27840 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
27850 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
27860 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
27870 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
27880 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
27890 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
278a0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
278b0 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
278c0 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
278d0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
278e0 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
278f0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
27900 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
27910 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
27920 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
27930 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
27940 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
27950 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
27960 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
27970 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
27980 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
27990 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61  prA, pExprB, iTa
279a0 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
279b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
279c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
279d0 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72  rue if we can pr
279e0 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c  ove the pE2 will
279f0 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20   always be true 
27a00 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75  if pE1 is.** tru
27a10 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  e.  Return false
27a20 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f   if we cannot co
27a30 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66  mplete the proof
27a40 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74   or if pE2 might
27a50 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45  .** be false.  E
27a60 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
27a70 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20     pE1: x==5    
27a80 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
27a90 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
27aa0 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
27ab0 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32  : x>0        pE2
27ac0 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
27ad0 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
27ae0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32  .**     pE1: x=2
27af0 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32  1       pE2: x=2
27b00 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65  1 OR y=43     Re
27b10 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
27b20 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20    pE1: x!=123   
27b30 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
27b40 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
27b50 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
27b60 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a   x!=?1      pE2:
27b70 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
27b80 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
27b90 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20  *     pE1: x IS 
27ba0 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20  NULL  pE2: x IS 
27bb0 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
27bc0 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
27bd0 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20   pE1: x IS ?2   
27be0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
27bf0 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66  ULL    Reuslt: f
27c00 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  alse.**.** When 
27c10 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c  comparing TK_COL
27c20 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65  UMN nodes betwee
27c30 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69  n pE1 and pE2, i
27c40 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70  f pE2 has.** Exp
27c50 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20  r.iTable<0 then 
27c60 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e  assume a table n
27c70 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69  umber given by i
27c80 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Tab..**.** When 
27c90 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
27ca0 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
27cb0 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
27cc0 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
27cd0 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
27ce0 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
27cf0 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
27d00 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
27d10 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
27d20 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
27d30 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
27d40 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
27d50 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
27d60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
27d70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70  rImpliesExpr(Exp
27d80 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45  r *pE1, Expr *pE
27d90 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  2, int iTab){.  
27da0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
27db0 6f 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c  ompare(pE1, pE2,
27dc0 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20   iTab)==0 ){.   
27dd0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
27de0 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
27df0 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74  _OR.   && (sqlit
27e00 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
27e10 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66  r(pE1, pE2->pLef
27e20 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20  t, iTab).       
27e30 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
27e40 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
27e50 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74  pE1, pE2->pRight
27e60 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20  , iTab) ).  ){. 
27e70 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
27e80 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
27e90 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45  TK_NOTNULL && pE
27ea0 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  1->op!=TK_ISNULL
27eb0 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f   && pE1->op!=TK_
27ec0 49 53 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  IS ){.    Expr *
27ed0 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pX = sqlite3Expr
27ee0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d  SkipCollate(pE1-
27ef0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 74 65 73  >pLeft);.    tes
27f00 74 63 61 73 65 28 20 70 58 21 3d 70 45 31 2d 3e  tcase( pX!=pE1->
27f10 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 69 66 28  pLeft );.    if(
27f20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
27f30 61 72 65 28 70 58 2c 20 70 45 32 2d 3e 70 4c 65  are(pX, pE2->pLe
27f40 66 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72  ft, iTab)==0 ) r
27f50 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
27f60 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
27f70 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
27f80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
27f90 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
27fa0 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c   by the tree wal
27fb0 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ker.** to determ
27fc0 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72 65 73  ine if an expres
27fd0 73 69 6f 6e 20 63 61 6e 20 62 65 20 65 76 61 6c  sion can be eval
27fe0 75 61 74 65 64 20 62 79 20 72 65 66 65 72 65 6e  uated by referen
27ff0 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64  ce to the.** ind
28000 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74  ex only, without
28010 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 20   having to do a 
28020 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 63  search for the c
28030 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
28040 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 20 54 68  table entry.  Th
28050 65 20 49 64 78 43 6f 76 65 72 2e 70 49 64 78 20  e IdxCover.pIdx 
28060 66 69 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64  field is the ind
28070 65 78 2e 20 20 49 64 78 43 6f 76 65 72 2e 69 43  ex.  IdxCover.iC
28080 75 72 0a 2a 2a 20 69 73 20 74 68 65 20 63 75 72  ur.** is the cur
28090 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sor for the tabl
280a0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78  e..*/.struct Idx
280b0 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65 78 20  Cover {.  Index 
280c0 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68  *pIdx;     /* Th
280d0 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65  e index to be te
280e0 73 74 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67  sted for coverag
280f0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  e */.  int iCur;
28100 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
28110 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
28120 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e   table correspon
28130 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65  ding to the inde
28140 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  x */.};../*.** C
28150 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
28160 68 65 72 65 20 61 72 65 20 72 65 66 65 72 65 6e  here are referen
28170 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
28180 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c  n table .** pWal
28190 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
281a0 2d 3e 69 43 75 72 20 63 61 6e 20 62 65 20 73 61  ->iCur can be sa
281b0 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 74 68  tisfied using th
281c0 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b  e index.** pWalk
281d0 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
281e0 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  >pIdx..*/.static
281f0 20 69 6e 74 20 65 78 70 72 49 64 78 43 6f 76 65   int exprIdxCove
28200 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
28210 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
28220 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
28230 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
28240 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
28250 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78  =pWalker->u.pIdx
28260 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20 20 26  Cover->iCur.   &
28270 26 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  & sqlite3ColumnO
28280 66 49 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e  fIndex(pWalker->
28290 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64  u.pIdxCover->pId
282a0 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  x, pExpr->iColum
282b0 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57  n)<0.  ){.    pW
282c0 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31  alker->eCode = 1
282d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
282e0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65  _Abort;.  }.  re
282f0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
28300 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  e;.}../*.** Dete
28310 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e 64 65  rmine if an inde
28320 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c 65 20  x pIdx on table 
28330 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72  with cursor iCur
28340 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a   contains will.*
28350 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
28360 20 70 45 78 70 72 2e 20 20 52 65 74 75 72 6e 20   pExpr.  Return 
28370 74 72 75 65 20 69 66 20 74 68 65 20 69 6e 64 65  true if the inde
28380 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74 68 65  x does cover the
28390 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
283a0 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  nd false if the 
283b0 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
283c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 61 62 6c   references tabl
283d0 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61  e columns.** tha
283e0 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20  t are not found 
283f0 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  in the index pId
28400 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65  x..**.** An inde
28410 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20 65 78  x covering an ex
28420 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74  pression means t
28430 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
28440 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61  on can be.** eva
28450 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c  luated using onl
28460 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  y the index and 
28470 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
28480 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20  o lookup the.** 
28490 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
284a0 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e  ble entry..*/.in
284b0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76  t sqlite3ExprCov
284c0 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20 20 45  eredByIndex(.  E
284d0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
284e0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
284f0 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a 2f 0a  to be tested */.
28500 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
28510 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
28520 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
28530 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
28540 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65   table */.  Inde
28550 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
28560 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61  /* The index tha
28570 74 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  t might be used 
28580 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  for coverage */.
28590 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
285a0 20 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72   struct IdxCover
285b0 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28   xcov;.  memset(
285c0 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
285d0 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72 20 3d  );.  xcov.iCur =
285e0 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49   iCur;.  xcov.pI
285f0 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78  dx = pIdx;.  w.x
28600 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
28610 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20 20 77  xprIdxCover;.  w
28620 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d 20 26  .u.pIdxCover = &
28630 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33 57  xcov;.  sqlite3W
28640 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
28650 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e  r);.  return !w.
28660 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  eCode;.}.../*.**
28670 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
28680 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
28690 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
286a0 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  by the tree walk
286b0 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72  er.** to count r
286c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
286d0 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  le columns in th
286e0 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61  e arguments of a
286f0 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20  n .** aggregate 
28700 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64  function, in ord
28710 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
28720 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75  the.** sqlite3Fu
28730 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20  nctionThisSrc() 
28740 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75  routine..*/.stru
28750 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20  ct SrcCount {.  
28760 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
28770 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c   /* One particul
28780 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  ar FROM clause i
28790 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79  n a nested query
287a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b   */.  int nThis;
287b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
287c0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
287d0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72  o columns in pSr
287e0 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  cList */.  int n
287f0 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e  Other;      /* N
28800 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
28810 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
28820 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  n other FROM cla
28830 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  uses */.};../*.*
28840 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
28850 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
28860 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a   to columns..*/.
28870 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
28880 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a  rcCount(Walker *
28890 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
288a0 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Expr){.  /* The 
288b0 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73  NEVER() on the s
288c0 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65  econd term is be
288d0 63 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e  cause sqlite3Fun
288e0 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
288f0 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79  ().  ** is alway
28900 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
28910 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
28920 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61  zeAggregates() a
28930 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54  nd so the.  ** T
28940 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e  K_COLUMNs have n
28950 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76  ot yet been conv
28960 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47  erted into TK_AG
28970 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20  G_COLUMN.  If.  
28980 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
28990 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20  onUsesThisSrc() 
289a0 69 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e  is used differen
289b0 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72  tly in the futur
289c0 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45  e, the.  ** NEVE
289d0 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  R() will need to
289e0 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a   be removed. */.
289f0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
28a00 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45  =TK_COLUMN || NE
28a10 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  VER(pExpr->op==T
28a20 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b  K_AGG_COLUMN) ){
28a30 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
28a40 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
28a50 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
28a60 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53  pSrcCount;.    S
28a70 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
28a80 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20  ->pSrc;.    int 
28a90 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53  nSrc = pSrc ? pS
28aa0 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20  rc->nSrc : 0;.  
28ab0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72    for(i=0; i<nSr
28ac0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
28ad0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
28ae0 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  ==pSrc->a[i].iCu
28af0 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
28b00 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53    }.    if( i<nS
28b10 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  rc ){.      p->n
28b20 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  This++;.    }els
28b30 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68  e{.      p->nOth
28b40 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  er++;.    }.  }.
28b50 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
28b60 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
28b70 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79  Determine if any
28b80 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
28b90 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46  s to the pExpr F
28ba0 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63  unction referenc
28bb0 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20  e.** pSrcList.  
28bc0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
28bd0 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65  hey do.  Also re
28be0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
28bf0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
28c00 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72   no arguments or
28c10 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61   has only consta
28c20 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
28c30 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70  eturn false if p
28c40 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63  Expr.** referenc
28c50 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e  es columns but n
28c60 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61  ot columns of ta
28c70 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53  bles found in pS
28c80 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73  rcList..*/.int s
28c90 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
28ca0 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a  esThisSrc(Expr *
28cb0 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a  pExpr, SrcList *
28cc0 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c  pSrcList){.  Wal
28cd0 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20  ker w;.  struct 
28ce0 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20  SrcCount cnt;.  
28cf0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28d00 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
28d10 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ON );.  memset(&
28d20 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
28d30 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
28d40 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75  ack = exprSrcCou
28d50 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f  nt;.  w.u.pSrcCo
28d60 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e  unt = &cnt;.  cn
28d70 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73  t.pSrc = pSrcLis
28d80 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d  t;.  cnt.nThis =
28d90 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72   0;.  cnt.nOther
28da0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57   = 0;.  sqlite3W
28db0 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20  alkExprList(&w, 
28dc0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
28dd0 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54  .  return cnt.nT
28de0 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74  his>0 || cnt.nOt
28df0 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  her==0;.}../*.**
28e00 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
28e10 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
28e20 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79  fo->aCol[] array
28e30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
28e40 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
28e50 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
28e60 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
28e70 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
28e80 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
28e90 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  int addAggInfoCo
28ea0 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  lumn(sqlite3 *db
28eb0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
28ec0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
28ed0 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  nfo->aCol = sqli
28ee0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
28ef0 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20  (.       db,.   
28f00 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c      pInfo->aCol,
28f10 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
28f20 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a  Info->aCol[0]),.
28f30 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
28f40 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26  Column,.       &
28f50 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
28f60 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
28f70 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
28f80 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
28f90 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79  o->aFunc[] array
28fa0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
28fb0 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
28fc0 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
28fd0 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
28fe0 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
28ff0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
29000 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75  int addAggInfoFu
29010 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nc(sqlite3 *db, 
29020 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
29030 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
29040 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74  o->aFunc = sqlit
29050 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
29060 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20  .       db, .   
29070 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63      pInfo->aFunc
29080 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
29090 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29  pInfo->aFunc[0])
290a0 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
290b0 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26  >nFunc,.       &
290c0 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
290d0 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
290e0 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70  This is the xExp
290f0 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20  rCallback for a 
29100 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74  tree walker.  It
29110 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69   is used to.** i
29120 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
29130 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
29140 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71  gates().  See sq
29150 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
29160 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f  Aggregates.** fo
29170 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
29180 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
29190 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
291a0 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20  ggregate(Walker 
291b0 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
291c0 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
291d0 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
291e0 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
291f0 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70  .pNC;.  Parse *p
29200 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
29210 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse;.  SrcList *
29220 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
29230 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49  pSrcList;.  AggI
29240 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
29250 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a  pNC->pAggInfo;..
29260 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
29270 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
29280 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
29290 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
292a0 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
292b0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
292c0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
292d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
292e0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
292f0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f  OLUMN );.      /
29300 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
29310 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
29320 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  in one of the ta
29330 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
29340 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
29350 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
29360 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
29370 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
29380 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
29390 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
293a0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
293b0 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20   pSrcList->a;.  
293c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
293d0 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
293e0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
293f0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
29400 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
29410 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ol;.          as
29420 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
29430 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
29440 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
29450 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
29460 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
29470 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
29480 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
29490 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65       /* If we re
294a0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
294b0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45  it means that pE
294c0 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20  xpr refers to a 
294d0 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
294e0 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20    ** that is in 
294f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
29500 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
29510 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20   query.  .      
29520 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
29530 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20       ** Make an 
29540 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f  entry for the co
29550 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f  lumn in pAggInfo
29560 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72  ->aCol[] if ther
29570 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
29580 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79   is not an entry
29590 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
295a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
295b0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
295c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
295d0 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ol = pAggInfo->a
295e0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
295f0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67   for(k=0; k<pAgg
29600 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  Info->nColumn; k
29610 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
29620 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
29630 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78  Col->iTable==pEx
29640 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
29650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29660 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  pCol->iColumn==p
29670 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
29680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29690 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
296a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
296b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
296c0 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e    if( (k>=pAggIn
296d0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20  fo->nColumn).   
296e0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20            && (k 
296f0 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  = addAggInfoColu
29700 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  mn(pParse->db, p
29710 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20  AggInfo))>=0 .  
29720 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
29730 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
29740 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
29750 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[k];.          
29760 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d      pCol->pTab =
29770 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
29780 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
29790 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
297a0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
297b0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
297c0 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
297d0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
297e0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d        pCol->iMem
297f0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
29800 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
29810 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
29820 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
29830 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
29840 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
29850 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
29860 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
29870 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
29880 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a        int j, n;.
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298a0 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20  ExprList *pGB = 
298b0 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
298c0 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  By;.            
298d0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
298e0 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20  ist_item *pTerm 
298f0 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20  = pGB->a;.      
29900 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47            n = pG
29910 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  B->nExpr;.      
29920 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
29930 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65  0; j<n; j++, pTe
29940 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
29950 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
29960 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
29970 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29980 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
29990 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d  TK_COLUMN && pE-
299a0 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
299b0 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
299c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299d0 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pE->iColumn==pEx
299e0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
299f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a00 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
29a10 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
29a40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29a50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29a60 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29a70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
29a80 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
29a90 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
29aa0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
29ab0 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41  orterColumn = pA
29ac0 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67  ggInfo->nSorting
29ad0 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
29ae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29b00 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
29b10 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  now an entry for
29b20 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e   pExpr in pAggIn
29b30 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68  fo->aCol[] (eith
29b40 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
29b50 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  * because it was
29b60 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72   there before or
29b70 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
29b80 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20   created it)..  
29b90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e            ** Con
29ba0 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74  vert the pExpr t
29bb0 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f  o be a TK_AGG_CO
29bc0 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74  LUMN referring t
29bd0 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  o that.         
29be0 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e     ** pAggInfo->
29bf0 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20  aCol[] entry..  
29c00 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
29c10 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
29c20 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
29c30 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
29c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
29c50 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
29c60 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
29c70 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
29c80 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a   TK_AGG_COLUMN;.
29c90 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
29ca0 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b  r->iAgg = (i16)k
29cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
29cc0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
29cd0 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d   /* endif pExpr-
29ce0 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
29cf0 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20  iCursor */.     
29d00 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70     } /* end loop
29d10 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a   over pSrcList *
29d20 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
29d30 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
29d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
29d50 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
29d60 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  : {.      if( (p
29d70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
29d80 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20  _InAggFunc)==0. 
29d90 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72        && pWalker
29da0 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70  ->walkerDepth==p
29db0 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20  Expr->op2.      
29dc0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
29dd0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
29de0 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
29df0 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
29e00 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
29e10 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
29e20 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
29e30 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
29e40 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
29e50 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
29e60 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
29e70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
29e80 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
29e90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
29ea0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
29eb0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
29ec0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29ed0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
29ee0 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
29ef0 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
29f00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
29f10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29f20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
29f30 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
29f40 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
29f50 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
29f60 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
29f70 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
29f80 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
29f90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29fa0 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
29fb0 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
29fc0 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
29fd0 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
29fe0 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
29ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a000 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
2a010 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2a020 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2a030 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2a040 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2a050 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
2a060 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
2a070 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2a080 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
2a090 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2a0a0 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
2a0b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2a0c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2a0d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a0e0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
2a0f0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2a100 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
2a110 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
2a120 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
2a130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a140 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
2a150 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ken, .          
2a160 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2a170 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  x.pList ? pExpr-
2a180 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
2a190 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
2a1a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2a1b0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
2a1c0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2a1d0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2a1e0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
2a1f0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2a200 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2a220 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2a230 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
2a240 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2a250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a260 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
2a270 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
2a280 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
2a290 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
2a2a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2a2b0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2a2c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2a2d0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
2a2e0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2a2f0 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
2a300 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
2a310 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2a320 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
2a330 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20  gg = (i16)i;.   
2a340 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
2a350 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
2a360 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2a370 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
2a380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a390 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2a3a0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2a3b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2a3c0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2a3d0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2a3e0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2a3f0 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
2a400 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
2a410 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
2a420 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c 6b  _PARAMETER(pWalk
2a430 65 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  er);.  UNUSED_PA
2a440 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29  RAMETER(pSelect)
2a450 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
2a460 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2a470 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45  * Analyze the pE
2a480 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  xpr expression l
2a490 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
2a4a0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
2a4b0 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
2a4c0 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
2a4d0 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67 67   be added to Agg
2a4e0 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
2a4f0 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a   pNC->pAggInfo.*
2a500 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64  * points to.  Ad
2a510 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
2a520 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65   are made on the
2a530 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
2a540 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e  as.** necessary.
2a550 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2a560 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
2a570 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
2a580 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
2a590 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79  as been.** analy
2a5a0 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65  zed by sqlite3Re
2a5b0 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
2a5c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a5d0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2a5e0 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65  egates(NameConte
2a5f0 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70  xt *pNC, Expr *p
2a600 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
2a610 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
2a620 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
2a630 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2a640 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2a650 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ate;.  w.xSelect
2a660 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
2a670 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2a680 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20  lect;.  w.u.pNC 
2a690 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28  = pNC;.  assert(
2a6a0 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
2a6b0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  0 );.  sqlite3Wa
2a6c0 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
2a6d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
2a6e0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2a6f0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
2a700 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
2a710 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
2a720 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
2a730 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2a740 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
2a750 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
2a760 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
2a770 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
2a780 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
2a790 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2a7a0 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
2a7b0 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
2a7c0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
2a7d0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2a7e0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
2a7f0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
2a800 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
2a810 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
2a820 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
2a830 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2a840 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2a850 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2a860 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
2a870 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
2a880 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2a890 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67  a single new reg
2a8a0 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f  ister for use to
2a8b0 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72   hold some inter
2a8c0 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a  mediate result..
2a8d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2a8e0 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
2a8f0 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
2a900 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d  Parse->nTempReg=
2a910 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2a920 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2a930 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
2a940 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
2a950 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
2a960 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  g];.}../*.** Dea
2a970 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
2a980 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c  er, making avail
2a990 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66  able for reuse f
2a9a0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
2a9b0 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20   purpose..**.** 
2a9c0 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73  If a register is
2a9d0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
2a9e0 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c   used by the col
2a9f0 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a  umn cache, then.
2aa00 2a 2a 20 74 68 65 20 64 65 61 6c 6c 6f 63 61 74  ** the deallocat
2aa10 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20  ion is deferred 
2aa20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e  until the column
2aa30 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74   cache line that
2aa40 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67   uses.** the reg
2aa50 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74  ister becomes st
2aa60 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ale..*/.void sql
2aa70 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2aa80 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
2aa90 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
2aaa0 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
2aab0 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
2aac0 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
2aad0 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69  empReg) ){.    i
2aae0 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
2aaf0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
2ab00 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50     for(i=0, p=pP
2ab10 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
2ab20 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
2ab30 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ache; i++, p++){
2ab40 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52  .      if( p->iR
2ab50 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
2ab60 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
2ab70 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
2ab80 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
2ab90 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  }.    pParse->aT
2aba0 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
2abb0 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
2abc0 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
2abd0 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
2abe0 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
2abf0 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
2ac00 76 65 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f  ve registers..*/
2ac10 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
2ac20 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
2ac30 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67  pParse, int nReg
2ac40 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
2ac50 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72   if( nReg==1 ) r
2ac60 65 74 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74  eturn sqlite3Get
2ac70 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
2ac80 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69  .  i = pParse->i
2ac90 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20  RangeReg;.  n = 
2aca0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2acb0 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e  g;.  if( nReg<=n
2acc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2acd0 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63  !usedAsColumnCac
2ace0 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b  he(pParse, i, i+
2acf0 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72  n-1) );.    pPar
2ad00 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d  se->iRangeReg +=
2ad10 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
2ad20 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20  e->nRangeReg -= 
2ad30 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nReg;.  }else{. 
2ad40 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e     i = pParse->n
2ad50 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
2ad60 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
2ad70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
2ad80 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  .}.void sqlite3R
2ad90 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2ada0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2adb0 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
2adc0 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d  g){.  if( nReg==
2add0 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
2ade0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
2adf0 50 61 72 73 65 2c 20 69 52 65 67 29 3b 0a 20 20  Parse, iReg);.  
2ae00 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2ae10 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2ae20 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
2ae30 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66  Reg, nReg);.  if
2ae40 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e  ( nReg>pParse->n
2ae50 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20  RangeReg ){.    
2ae60 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2ae70 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50  g = nReg;.    pP
2ae80 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
2ae90 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
2aea0 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65  *.** Mark all te
2aeb0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2aec0 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61  s as being unava
2aed0 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
2aee0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2aef0 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2af00 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
2af10 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65  ){.  pParse->nTe
2af20 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61  mpReg = 0;.  pPa
2af30 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2af40 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c   0;.}../*.** Val
2af50 69 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65  idate that no te
2af60 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2af70 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68   falls within th
2af80 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46  e range of.** iF
2af90 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63  irst..iLast, inc
2afa0 6c 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f  lusive.  This ro
2afb0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
2afc0 6c 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ll from within a
2afd0 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
2afe0 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  ments..*/.#ifdef
2aff0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
2b000 74 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73  t sqlite3NoTemps
2b010 49 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  InRange(Parse *p
2b020 50 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73  Parse, int iFirs
2b030 74 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20  t, int iLast){. 
2b040 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50   int i;.  if( pP
2b050 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e  arse->nRangeReg>
2b060 30 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e  0.   && pParse->
2b070 69 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65  iRangeReg+pParse
2b080 2d 3e 6e 52 61 6e 67 65 52 65 67 3c 69 4c 61 73  ->nRangeReg<iLas
2b090 74 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e  t.   && pParse->
2b0a0 69 52 61 6e 67 65 52 65 67 3e 3d 69 46 69 72 73  iRangeReg>=iFirs
2b0b0 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75  t.  ){.     retu
2b0c0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
2b0d0 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
2b0e0 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20  TempReg; i++){. 
2b0f0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
2b100 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72  TempReg[i]>=iFir
2b110 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54  st && pParse->aT
2b120 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74  empReg[i]<=iLast
2b130 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2b140 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2b150 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2b160 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
2b170 55 47 20 2a 2f 0a                                UG */.