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

Artifact 028c34005cb804abe8f73453ac08baa44f4b63f9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47    if( op==TK_AGG
07c0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
07d0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
07e0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 61  return sqlite3Ta
07f0: 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74  bleColumnAffinit
0800: 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20 70  y(pExpr->pTab, p
0810: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
0820: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0830: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
0840: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
0850: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
0860: 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  s&EP_xIsSelect )
0870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
0880: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
0890: 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  (.        pExpr-
08a0: 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65 63  >pLeft->x.pSelec
08b0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  t->pEList->a[pEx
08c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
08d0: 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  pr.    );.  }.  
08e0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
08f0: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0900: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0910: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0920: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0930: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0940: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
0950: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
0960: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
0970: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78  nter to a new Ex
0980: 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20  pr node that.** 
0990: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43  implements the C
09a0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
09b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
09c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
09d0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74  ror occurs, that
09e0: 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65   fact is recorde
09f0: 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a  d in pParse->db.
0a00: 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72  ** and the pExpr
0a10: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65   parameter is re
0a20: 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64  turned unchanged
0a30: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0a40: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
0a50: 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  Token(.  Parse *
0a60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
0a70: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
0a80: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
0a90: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
0aa0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22 43     /* Add the "C
0ab0: 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20 74  OLLATE" clause t
0ac0: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
0ad0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  n */.  const Tok
0ae0: 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20  en *pCollName,  
0af0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  /* Name of colla
0b00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
0b10: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0b30: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 70  rue to dequote p
0b40: 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  CollName */.){. 
0b50: 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e   if( pCollName->
0b60: 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  n>0 ){.    Expr 
0b70: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
0b80: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
0b90: 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c  >db, TK_COLLATE,
0ba0: 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75   pCollName, dequ
0bb0: 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ote);.    if( pN
0bc0: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
0bd0: 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b  ->pLeft = pExpr;
0be0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
0bf0: 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65  gs |= EP_Collate
0c00: 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20  |EP_Skip;.      
0c10: 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
0c20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
0c30: 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a   pExpr;.}.Expr *
0c40: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0c50: 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72 73  llateString(Pars
0c60: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
0c70: 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63 68  *pExpr, const ch
0c80: 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e  ar *zC){.  Token
0c90: 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   s;.  assert( zC
0ca0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
0cb0: 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28 63  TokenInit(&s, (c
0cc0: 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75  har*)zC);.  retu
0cd0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 64  rn sqlite3ExprAd
0ce0: 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50  dCollateToken(pP
0cf0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73 2c  arse, pExpr, &s,
0d00: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b   0);.}../*.** Sk
0d10: 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43  ip over any TK_C
0d20: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73  OLLATE operators
0d30: 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c   and any unlikel
0d40: 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69  y().** or likeli
0d50: 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  hood() function 
0d60: 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  at the root of a
0d70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  n expression..*/
0d80: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
0d90: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78  prSkipCollate(Ex
0da0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 68  pr *pExpr){.  wh
0db0: 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45 78  ile( pExpr && Ex
0dc0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0dd0: 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b  xpr, EP_Skip) ){
0de0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
0df0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0e00: 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a  EP_Unlikely) ){.
0e10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
0e20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0e30: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
0e40: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ct) );.      ass
0e50: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
0e60: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
0e70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
0e80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
0e90: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45  TION );.      pE
0ea0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  xpr = pExpr->x.p
0eb0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
0ec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0ed0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0ee0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0ef0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20   );.      pExpr 
0f00: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
0f10: 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72      }.  }   .  r
0f20: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
0f30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0f40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0f50: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
0f60: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
0f70: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
0f80: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  defined collatin
0f90: 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75  g sequence, retu
0fa0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
0fb0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
0fc0: 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64  uence might be d
0fd0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43  etermined by a C
0fe0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a  OLLATE operator.
0ff0: 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72 65  ** or by the pre
1000: 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d  sence of a colum
1010: 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  n with a defined
1020: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1030: 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20  nce..** COLLATE 
1040: 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66  operators take f
1050: 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e  irst precedence.
1060: 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20    Left operands 
1070: 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e  take.** preceden
1080: 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70  ce over right op
1090: 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53  erands..*/.CollS
10a0: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
10b0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
10c0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
10d0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
10e0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10f0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1100: 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20   = 0;.  Expr *p 
1110: 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  = pExpr;.  while
1120: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  ( p ){.    int o
1130: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69  p = p->op;.    i
1140: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
1150: 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b  _Generic ) break
1160: 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b  ;.    if( op==TK
1170: 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  _CAST || op==TK_
1180: 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 70  UPLUS ){.      p
1190: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
11a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
11b0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
11c0: 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70  K_COLLATE || (op
11d0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26  ==TK_REGISTER &&
11e0: 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c   p->op2==TK_COLL
11f0: 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70 43  ATE) ){.      pC
1200: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
1210: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1220: 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75  ENC(db), 0, p->u
1230: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1240: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1250: 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47   if( (op==TK_AGG
1260: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
1270: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1280: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
1290: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
12a0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26 26  TRIGGER).     &&
12b0: 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20   p->pTab!=0.    
12c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d  ){.      /* op==
12d0: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
12e0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
12f0: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
1300: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
1310: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
1320: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
1330: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
1340: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
1350: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
1360: 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75  int j = p->iColu
1370: 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e  mn;.      if( j>
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
1390: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
13a0: 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  = p->pTab->aCol[
13b0: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
13c0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
13d0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
13e0: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
13f0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1410: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
1420: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
1430: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
1440: 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66 74  eft && (p->pLeft
1450: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
1460: 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  late)!=0 ){.    
1470: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
1480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1490: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
14a0: 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b  xt  = p->pRight;
14b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
14c0: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
14d0: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
14e0: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
14f0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
1500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1510: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
1520: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1530: 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61         /* p->fla
1540: 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c  gs holds EP_Coll
1550: 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74  ate and p->pLeft
1560: 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74  ->flags does not
1570: 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20 2a  .  And.        *
1580: 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63  * p->x.pSelect c
1590: 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d  annot.  So if p-
15a0: 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73 2c  >x.pLeft exists,
15b0: 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61 74   it must hold at
15c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 73  .        ** leas
15d0: 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65  t one EP_Collate
15e0: 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f  . Thus the follo
15f0: 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53 2e  wing two ALWAYS.
1600: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1610: 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26  p->x.pList!=0 &&
1620: 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61 73   ALWAYS(!ExprHas
1630: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
1640: 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20 20  IsSelect)) ){.  
1650: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
1660: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1670: 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e  ; ALWAYS(i<p->x.
1680: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69  pList->nExpr); i
1690: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
16a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16b0: 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d  erty(p->x.pList-
16c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  >a[i].pExpr, EP_
16d0: 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  Collate) ){.    
16e0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74 20            pNext 
16f0: 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  = p->x.pList->a[
1700: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1720: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1740: 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70   }.        p = p
1750: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
1770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1780: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65    if( sqlite3Che
1790: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
17a0: 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20  , pColl) ){ .   
17b0: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a   pColl = 0;.  }.
17c0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
17d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
17e0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
17f0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1800: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1810: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1820: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1830: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1840: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1850: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1860: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1870: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1880: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1890: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
18a0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
18b0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
18c0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
18d0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
18e0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
18f0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1900: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1910: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1920: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1930: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1940: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1950: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1960: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1970: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1980: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1990: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
19a0: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
19b0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
19c0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
19d0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
19e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19f0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1a10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1a20: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1a30: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1a40: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1a50: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1a60: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1a70: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1a80: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1a90: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1aa0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1ac0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ad0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ae0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1af0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1b00: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1b10: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1b20: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1b30: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1b40: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1b50: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1b60: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1b70: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1b80: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1b90: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1ba0: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1bb0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1bc0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1bd0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1be0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1bf0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1c00: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
1c10: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
1c20: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
1c30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
1c40: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1c50: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
1c60: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
1c70: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
1c80: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
1c90: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
1ca0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
1cb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1cc0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
1cd0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
1ce0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1cf0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
1d00: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
1d10: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
1d20: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1d30: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1d40: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
1d50: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
1d60: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1d70: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
1d80: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
1d90: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
1da0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1db0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1dc0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
1dd0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1de0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1df0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1e00: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
1e10: 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 61 66  lse if( NEVER(af
1e20: 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 61 66 66  f==0) ){.    aff
1e30: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
1e40: 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OB;.  }.  return
1e50: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70   aff;.}../*.** p
1e60: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
1e70: 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  ison expression,
1e80: 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49   eg. '=', '<', I
1e90: 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69  N(...) etc..** i
1ea0: 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74  dx_affinity is t
1eb0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61  he affinity of a
1ec0: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
1ed0: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a  . Return true.**
1ee0: 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69   if the index wi
1ef0: 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f  th affinity idx_
1f00: 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20  affinity may be 
1f10: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1f20: 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  t.** the compari
1f30: 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f  son in pExpr..*/
1f40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
1f50: 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72  xAffinityOk(Expr
1f60: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64   *pExpr, char id
1f70: 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63  x_affinity){.  c
1f80: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
1f90: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
1fa0: 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61  pr);.  switch( a
1fb0: 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ff ){.    case S
1fc0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a  QLITE_AFF_BLOB:.
1fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1fe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ff0: 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
2000: 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e  return idx_affin
2010: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
2020: 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75 6c  TEXT;.    defaul
2030: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
2040: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
2050: 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66  Affinity(idx_aff
2060: 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  inity);.  }.}../
2070: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2080: 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73 68  P5 value that sh
2090: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
20a0: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
20b0: 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28  ison.** opcode (
20c0: 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63  OP_Eq, OP_Ge etc
20d0: 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  .) used to compa
20e0: 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70 45  re pExpr1 and pE
20f0: 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xpr2..*/.static 
2100: 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65  u8 binaryCompare
2110: 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c  P5(Expr *pExpr1,
2120: 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69   Expr *pExpr2, i
2130: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
2140: 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61 72    u8 aff = (char
2150: 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69  )sqlite3ExprAffi
2160: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
2170: 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69 74 65  aff = (u8)sqlite
2180: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
2190: 28 70 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20  (pExpr1, aff) | 
21a0: 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a  (u8)jumpIfNull;.
21b0: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
21c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21d0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
21e0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
21f0: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2200: 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69   used by.** a bi
2210: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  nary comparison 
2220: 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69  operator compari
2230: 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  ng pLeft and pRi
2240: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ght..**.** If th
2250: 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72  e left hand expr
2260: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
2270: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
2280: 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73  type, then it is
2290: 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77  .** used. Otherw
22a0: 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ise the collatio
22b0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
22c0: 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 65 78  he right hand ex
22d0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75  pression.** is u
22e0: 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61  sed, or the defa
22f0: 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66 20  ult (BINARY) if 
2300: 6e 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69  neither expressi
2310: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
2320: 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a  ng.** type..**.*
2330: 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69 67 68  * Argument pRigh
2340: 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65 66 74  t (but not pLeft
2350: 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c 20  ) may be a null 
2360: 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68 69 73  pointer. In this
2370: 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20   case,.** it is 
2380: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  not considered..
2390: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
23a0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
23b0: 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65  CollSeq(.  Parse
23c0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70   *pParse, .  Exp
23d0: 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70  r *pLeft, .  Exp
23e0: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43  r *pRight.){.  C
23f0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
2400: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
2410: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66  ;.  if( pLeft->f
2420: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2430: 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  e ){.    pColl =
2440: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2450: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2460: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
2470: 70 52 69 67 68 74 20 26 26 20 28 70 52 69 67 68  pRight && (pRigh
2480: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
2490: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
24a0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
24b0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
24c0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  se, pRight);.  }
24d0: 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  else{.    pColl 
24e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
24f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
2500: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  ft);.    if( !pC
2510: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
2520: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2530: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2540: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
2550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
2560: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  l;.}../*.** Gene
2570: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
2580: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
2590: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
25a0: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
25b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
25d0: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
25e0: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
25f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2600: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
2610: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2620: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2630: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
2640: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2650: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
2660: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
2670: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2680: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
2690: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
26a0: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
26b0: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
26c0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
26d0: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
26e0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
26f0: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
2700: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
2710: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
2720: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
2730: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
2740: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
2750: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
2760: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
2770: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
2780: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
2790: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
27a0: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
27b0: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
27c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
27d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
27e0: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
27f0: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
2820: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
2830: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2840: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2850: 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74 75 72  (u8)p5);.  retur
2860: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
2870: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2880: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
2890: 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 6f 72   is a vector, or
28a0: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
28b0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74 6f 72  ..**.** A vector
28c0: 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20 61   is defined as a
28d0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
28e0: 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20 74 77  at results in tw
28f0: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 6f 6c  o or more.** col
2900: 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74 2e 20  umns of result. 
2910: 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54 4f 52   Every TK_VECTOR
2920: 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65 63 74   node is an vect
2930: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  or because the.*
2940: 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20 6e 6f  * parser will no
2950: 74 20 67 65 6e 65 72 61 74 65 20 61 20 54 4b 5f  t generate a TK_
2960: 56 45 43 54 4f 52 20 77 69 74 68 20 66 65 77 65  VECTOR with fewe
2970: 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74 72 69  r than two entri
2980: 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54 4b 5f  es..** But a TK_
2990: 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62 65 20  SELECT might be 
29a0: 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72 20  either a vector 
29b0: 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49 74 20  or a scalar. It 
29c0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e 73 69  is only.** consi
29d0: 64 65 72 65 64 20 61 20 76 65 63 74 6f 72 20 69  dered a vector i
29e0: 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f 72 20  f it has two or 
29f0: 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  more result colu
2a00: 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mns..*/.int sqli
2a10: 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
2a20: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2a30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
2a40: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
2a50: 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pr)>1;.}../*.** 
2a60: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
2a70: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
2a80: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73  only argument is
2a90: 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54   of type TK_VECT
2aa0: 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  OR .** return th
2ab0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 70 72  e number of expr
2ac0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 76  essions in the v
2ad0: 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20 74 68  ector. Or, if th
2ae0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
2af0: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c  is a sub-select,
2b00: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
2b10: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2b20: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
2b30: 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74 68 65   For.** any othe
2b40: 72 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73  r type of expres
2b50: 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31 2e 0a  sion, return 1..
2b60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2b70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45 78 70  prVectorSize(Exp
2b80: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 38 20  r *pExpr){.  u8 
2b90: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
2ba0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
2bb0: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 45 78  ISTER ) op = pEx
2bc0: 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28 20 6f  pr->op2;.  if( o
2bd0: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 7b 0a  p==TK_VECTOR ){.
2be0: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
2bf0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2c00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2c10: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
2c20: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
2c30: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
2c40: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2c50: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
2c60: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
2c70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2c80: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 52 65 74 75  QUERY./*.** Retu
2c90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2ca0: 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  a subexpression 
2cb0: 6f 66 20 70 56 65 63 74 6f 72 20 74 68 61 74 20  of pVector that 
2cc0: 69 73 20 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63  is the i-th.** c
2cd0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
2ce0: 74 6f 72 20 28 6e 75 6d 62 65 72 65 64 20 73 74  tor (numbered st
2cf0: 61 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20  arting with 0). 
2d00: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
2d10: 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20  .** ensure that 
2d20: 69 20 69 73 20 77 69 74 68 69 6e 20 72 61 6e 67  i is within rang
2d30: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63  e..**.** If pVec
2d40: 74 6f 72 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tor is really a 
2d50: 73 63 61 6c 61 72 20 28 61 6e 64 20 22 73 63 61  scalar (and "sca
2d60: 6c 61 72 22 20 68 65 72 65 20 69 6e 63 6c 75 64  lar" here includ
2d70: 65 73 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  es subqueries.**
2d80: 20 74 68 61 74 20 72 65 74 75 72 6e 20 61 20 73   that return a s
2d90: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74  ingle column!) t
2da0: 68 65 6e 20 72 65 74 75 72 6e 20 70 56 65 63 74  hen return pVect
2db0: 6f 72 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  or unmodified..*
2dc0: 2a 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74  *.** pVector ret
2dd0: 61 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f  ains ownership o
2de0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  f the returned s
2df0: 75 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  ubexpression..**
2e00: 0a 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f  .** If the vecto
2e10: 72 20 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e  r is a (SELECT .
2e20: 2e 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78 70  ..) then the exp
2e30: 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64  ression returned
2e40: 20 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20   is.** just the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74  expression for t
2e60: 68 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20  he i-th term of 
2e70: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
2e80: 61 6e 64 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62  and may.** not b
2e90: 65 20 72 65 61 64 79 20 66 6f 72 20 65 76 61 6c  e ready for eval
2ea0: 75 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74  uation because t
2eb0: 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  he table cursor 
2ec0: 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62  has not yet.** b
2ed0: 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a  een positioned..
2ee0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2ef0: 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
2f00: 70 72 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72  pr(Expr *pVector
2f10: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
2f20: 72 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70  rt( i<sqlite3Exp
2f30: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63  rVectorSize(pVec
2f40: 74 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71  tor) );.  if( sq
2f50: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2f60: 72 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20  r(pVector) ){.  
2f70: 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74 6f    assert( pVecto
2f80: 72 2d 3e 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65  r->op2==0 || pVe
2f90: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  ctor->op==TK_REG
2fa0: 49 53 54 45 52 20 29 3b 0a 20 20 20 20 69 66 28  ISTER );.    if(
2fb0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
2fc0: 5f 53 45 4c 45 43 54 20 7c 7c 20 70 56 65 63 74  _SELECT || pVect
2fd0: 6f 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45  or->op2==TK_SELE
2fe0: 43 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  CT ){.      retu
2ff0: 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53  rn pVector->x.pS
3000: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
3010: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [i].pExpr;.    }
3020: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
3030: 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c  rn pVector->x.pL
3040: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
3050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3060: 75 72 6e 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 23  urn pVector;.}.#
3070: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
3080: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
3090: 42 51 55 45 52 59 29 20 2a 2f 0a 0a 23 69 66 6e  BQUERY) */..#ifn
30a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30b0: 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 43  SUBQUERY./*.** C
30c0: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
30d0: 6e 20 61 20 6e 65 77 20 45 78 70 72 20 6f 62 6a  n a new Expr obj
30e0: 65 63 74 20 77 68 69 63 68 20 77 68 65 6e 20 70  ect which when p
30f0: 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73 71 6c 69  assed to.** sqli
3100: 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 77 69  te3ExprCode() wi
3110: 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 6c 6c 20  ll generate all 
3120: 6e 65 63 65 73 73 61 72 79 20 63 6f 64 65 20 74  necessary code t
3130: 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  o compute.** the
3140: 20 69 46 69 65 6c 64 2d 74 68 20 63 6f 6c 75 6d   iField-th colum
3150: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
3160: 65 78 70 72 65 73 73 69 6f 6e 20 70 56 65 63 74  expression pVect
3170: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  or..**.** It is 
3180: 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f 72 20 74  ok for pVector t
3190: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 28 61  o be a scalar (a
31a0: 73 20 6c 6f 6e 67 20 61 73 20 69 46 69 65 6c 64  s long as iField
31b0: 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e 20 74 68  ==0).  .** In th
31c0: 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  at case, this ro
31d0: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
31e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
31f0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
3200: 6c 65 72 20 6f 77 6e 73 20 74 68 65 20 72 65 74  ler owns the ret
3210: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3220: 74 20 61 6e 64 20 69 73 20 72 65 73 70 6f 6e 73  t and is respons
3230: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65 6e 73 75  ible for.** ensu
3240: 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65  ring that the re
3250: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 65 76 65  turned value eve
3260: 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65  ntually gets fre
3270: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ed..**.** The ca
3280: 6c 6c 65 72 20 72 65 74 61 69 6e 73 20 6f 77 6e  ller retains own
3290: 65 72 73 68 69 70 20 6f 66 20 70 56 65 63 74 6f  ership of pVecto
32a0: 72 2e 20 20 49 66 20 70 56 65 63 74 6f 72 20 69  r.  If pVector i
32b0: 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a  s a TK_SELECT,.*
32c0: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  * then the retur
32d0: 6e 65 64 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ned object will 
32e0: 72 65 66 65 72 65 6e 63 65 20 70 56 65 63 74 6f  reference pVecto
32f0: 72 20 61 6e 64 20 73 6f 20 70 56 65 63 74 6f 72  r and so pVector
3300: 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a 2a 2a 20   must remain.** 
3310: 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6c 69  valid for the li
3320: 66 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  fe of the return
3330: 65 64 20 6f 62 6a 65 63 74 2e 20 20 49 66 20 70  ed object.  If p
3340: 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 56  Vector is a TK_V
3350: 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61 20 73 63  ECTOR.** or a sc
3360: 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2c  alar expression,
3370: 20 74 68 65 6e 20 69 74 20 63 61 6e 20 62 65 20   then it can be 
3380: 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f 6e 20  deleted as soon 
3390: 61 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  as this routine.
33a0: 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  ** returns..**.*
33b0: 2a 20 41 20 74 72 69 63 6b 20 74 6f 20 63 61 75  * A trick to cau
33c0: 73 65 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 70  se a TK_SELECT p
33d0: 56 65 63 74 6f 72 20 74 6f 20 62 65 20 64 65 6c  Vector to be del
33e0: 65 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69  eted together wi
33f0: 74 68 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e  th.** the return
3400: 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 69  ed Expr object i
3410: 73 20 74 6f 20 61 74 74 61 63 68 20 74 68 65 20  s to attach the 
3420: 70 56 65 63 74 6f 72 20 74 6f 20 74 68 65 20 70  pVector to the p
3430: 52 69 67 68 74 20 66 69 65 6c 64 0a 2a 2a 20 6f  Right field.** o
3440: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 54  f the returned T
3450: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
3460: 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Expr object..*/.
3470: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3480: 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28  rForVectorField(
3490: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
34a0: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
34b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
34c0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20  Expr *pVector,  
34d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74       /* The vect
34e0: 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20 65 78 70  or.  List of exp
34f0: 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75  ressions or a su
3500: 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e  b-SELECT */.  in
3510: 74 20 69 46 69 65 6c 64 20 20 20 20 20 20 20 20  t iField        
3520: 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75     /* Which colu
3530: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
3540: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b   to return */.){
3550: 0a 20 20 45 78 70 72 20 2a 70 52 65 74 3b 0a 20  .  Expr *pRet;. 
3560: 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70   if( pVector->op
3570: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
3580: 20 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74     assert( pVect
3590: 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  or->flags & EP_x
35a0: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
35b0: 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c 45 43 54  /* The TK_SELECT
35c0: 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6e 6f 64  _COLUMN Expr nod
35d0: 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
35e0: 20 70 4c 65 66 74 3a 20 20 20 20 20 20 20 20 20   pLeft:         
35f0: 20 20 70 56 65 63 74 6f 72 20 63 6f 6e 74 61 69    pVector contai
3600: 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43 54 0a 20  ning TK_SELECT. 
3610: 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20 20 20     ** pRight:   
3620: 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65 64 2e         not used.
3630: 20 20 42 75 74 20 72 65 63 75 72 73 69 76 65 6c    But recursivel
3640: 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  y deleted..    *
3650: 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20 20 20  * iColumn:      
3660: 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20 63 6f     Index of a co
3670: 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f 72 0a  lumn in pVector.
3680: 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69 54      ** pLeft->iT
3690: 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69 6e  able:   First in
36a0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
36b0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65  ister holding re
36c0: 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20 2a  sult, or 0.    *
36d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
36e0: 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c 74     if the result
36f0: 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d 70   is not yet comp
3700: 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uted..    **.   
3710: 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44   ** sqlite3ExprD
3720: 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69 63  elete() specific
3730: 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20 72  ally skips the r
3740: 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65 20  ecursive delete 
3750: 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 20  of.    ** pLeft 
3760: 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  on TK_SELECT_COL
3770: 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74 20  UMN nodes.  But 
3780: 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f 77  pRight is follow
3790: 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a 20  ed, so pVector. 
37a0: 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74 74     ** can be att
37b0: 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74 20  ached to pRight 
37c0: 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e 6f  to cause this no
37d0: 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65 72  de to take owner
37e0: 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20 70  ship of.    ** p
37f0: 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61 6c  Vector.  Typical
3800: 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65  ly there will be
3810: 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45 4c   multiple TK_SEL
3820: 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73  ECT_COLUMN nodes
3830: 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
3840: 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69 6e   same pLeft poin
3850: 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63 74  ter to the pVect
3860: 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e 65  or, but only one
3870: 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
3880: 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56 65  will own the pVe
3890: 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctor..    */.   
38a0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 50   pRet = sqlite3P
38b0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
38c0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20 30  SELECT_COLUMN, 0
38d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
38e0: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70   pRet ){.      p
38f0: 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69  Ret->iColumn = i
3900: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65  Field;.      pRe
3910: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74  t->pLeft = pVect
3920: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
3930: 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c  sert( pRet==0 ||
3940: 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30   pRet->iTable==0
3950: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
3960: 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70   if( pVector->op
3970: 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56  ==TK_VECTOR ) pV
3980: 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d  ector = pVector-
3990: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65  >x.pList->a[iFie
39a0: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  ld].pExpr;.    p
39b0: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
39c0: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
39d0: 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20   pVector, 0);.  
39e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
39f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
3a00: 66 69 6e 65 28 53 51 4c 49 54 45 5f 4f 4d 49 54  fine(SQLITE_OMIT
3a10: 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a 2f  _SUBQUERY) */../
3a20: 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69  *.** If expressi
3a30: 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20 74  on pExpr is of t
3a40: 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67  ype TK_SELECT, g
3a50: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
3a60: 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20  evaluate.** it. 
3a70: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
3a80: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  ter in which the
3a90: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3aa0: 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a  d (or, if the .*
3ab0: 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74  * sub-select ret
3ac0: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
3ad0: 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66  ne column, the f
3ae0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3af0: 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72 73  .** of registers
3b00: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3b10: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29 2e  sult is stored).
3b20: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
3b30: 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45  is not a TK_SELE
3b40: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  CT expression, r
3b50: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
3b60: 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 53  ic int exprCodeS
3b70: 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ubselect(Parse *
3b80: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
3b90: 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67 20  xpr){.  int reg 
3ba0: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
3bb0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
3bc0: 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  Y.  if( pExpr->o
3bd0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
3be0: 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74 65      reg = sqlite
3bf0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
3c00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
3c10: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
3c20: 20 20 72 65 74 75 72 6e 20 72 65 67 3b 0a 7d 0a    return reg;.}.
3c30: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
3c40: 70 56 65 63 74 6f 72 20 70 6f 69 6e 74 73 20 74  pVector points t
3c50: 6f 20 61 20 76 65 63 74 6f 72 20 65 78 70 72 65  o a vector expre
3c60: 73 73 69 6f 6e 20 2d 20 65 69 74 68 65 72 20 61  ssion - either a
3c70: 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72   TK_VECTOR.** or
3c80: 20 54 4b 5f 53 45 4c 45 43 54 20 74 68 61 74 20   TK_SELECT that 
3c90: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3ca0: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54 68  n one column. Th
3cb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
3cc0: 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  rns.** the regis
3cd0: 74 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  ter number of a 
3ce0: 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63 6f  register that co
3cf0: 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
3d00: 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 69   of.** element i
3d10: 46 69 65 6c 64 20 6f 66 20 74 68 65 20 76 65 63  Field of the vec
3d20: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56  tor..**.** If pV
3d30: 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45  ector is a TK_SE
3d40: 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c  LECT expression,
3d50: 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 69   then code for i
3d60: 74 20 6d 75 73 74 20 68 61 76 65 20 0a 2a 2a 20  t must have .** 
3d70: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e  already been gen
3d80: 65 72 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  erated using the
3d90: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
3da0: 63 74 28 29 20 72 6f 75 74 69 6e 65 2e 20 49 6e  ct() routine. In
3db0: 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 70 61   this.** case pa
3dc0: 72 61 6d 65 74 65 72 20 72 65 67 53 65 6c 65 63  rameter regSelec
3dd0: 74 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  t should be the 
3de0: 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
3df0: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 2a  y of registers.*
3e00: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
3e10: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
3e20: 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a 0a  sub-select. .**.
3e30: 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69 73  ** If pVector is
3e40: 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54   of type TK_VECT
3e50: 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  OR, then code fo
3e60: 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  r the requested 
3e70: 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67 65 6e 65  field.** is gene
3e80: 72 61 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  rated. In this c
3e90: 61 73 65 20 28 2a 70 52 65 67 46 72 65 65 29 20  ase (*pRegFree) 
3ea0: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 74 68  may be set to th
3eb0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61  e number of.** a
3ec0: 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
3ed0: 74 65 72 20 74 6f 20 62 65 20 66 72 65 65 64 20  ter to be freed 
3ee0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 65  by the caller be
3ef0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
3f00: 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
3f10: 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75 74 20 70  urning, output p
3f20: 61 72 61 6d 65 74 65 72 20 28 2a 70 70 45 78 70  arameter (*ppExp
3f30: 72 29 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  r) is set to poi
3f40: 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 45 78 70  nt to the.** Exp
3f50: 72 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  r object corresp
3f60: 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65 6d 65 6e  onding to elemen
3f70: 74 20 69 45 6c 65 6d 20 6f 66 20 74 68 65 20 76  t iElem of the v
3f80: 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ector..*/.static
3f90: 20 69 6e 74 20 65 78 70 72 56 65 63 74 6f 72 52   int exprVectorR
3fa0: 65 67 69 73 74 65 72 28 0a 20 20 50 61 72 73 65  egister(.  Parse
3fb0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
3fd0: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
3fe0: 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20   Expr *pVector, 
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f 20 65 78   /* Vector to ex
4010: 74 72 61 63 74 20 65 6c 65 6d 65 6e 74 20 66 72  tract element fr
4020: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65  om */.  int iFie
4030: 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ld,             
4040: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64          /* Field
4050: 20 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f 6d   to extract from
4060: 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20 20 69 6e   pVector */.  in
4070: 74 20 72 65 67 53 65 6c 65 63 74 2c 20 20 20 20  t regSelect,    
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4090: 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79 20   First in array 
40a0: 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  of registers */.
40b0: 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 2c    Expr **ppExpr,
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40d0: 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70 72 65 73    /* OUT: Expres
40e0: 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  sion element */.
40f0: 20 20 69 6e 74 20 2a 70 52 65 67 46 72 65 65 20    int *pRegFree 
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d 70 20 72    /* OUT: Temp r
4120: 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20  egister to free 
4130: 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20  */.){.  u8 op = 
4140: 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a 20 20 61  pVector->op;.  a
4150: 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 56 45  ssert( op==TK_VE
4160: 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52  CTOR || op==TK_R
4170: 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54  EGISTER || op==T
4180: 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 69 66  K_SELECT );.  if
4190: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
41a0: 52 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72  R ){.    *ppExpr
41b0: 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
41c0: 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 56 65  FieldSubexpr(pVe
41d0: 63 74 6f 72 2c 20 69 46 69 65 6c 64 29 3b 0a 20  ctor, iField);. 
41e0: 20 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f     return pVecto
41f0: 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69 65 6c 64  r->iTable+iField
4200: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
4210: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
4220: 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74   *ppExpr = pVect
4230: 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  or->x.pSelect->p
4240: 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d  EList->a[iField]
4250: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 72 65 74  .pExpr;.     ret
4260: 75 72 6e 20 72 65 67 53 65 6c 65 63 74 2b 69 46  urn regSelect+iF
4270: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a 70 70 45  ield;.  }.  *ppE
4280: 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  xpr = pVector->x
4290: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
42a0: 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72  ].pExpr;.  retur
42b0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  n sqlite3ExprCod
42c0: 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 2a 70  eTemp(pParse, *p
42d0: 70 45 78 70 72 2c 20 70 52 65 67 46 72 65 65 29  pExpr, pRegFree)
42e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65  ;.}../*.** Expre
42f0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61  ssion pExpr is a
4300: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77   comparison betw
4310: 65 65 6e 20 74 77 6f 20 76 65 63 74 6f 72 20 76  een two vector v
4320: 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74 65 0a 2a  alues. Compute.*
4330: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
4340: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 28  the comparison (
4350: 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c 29 20 61  1, 0, or NULL) a
4360: 6e 64 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a  nd write that.**
4370: 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65 67   result into reg
4380: 69 73 74 65 72 20 64 65 73 74 2e 0a 2a 2a 0a 2a  ister dest..**.*
4390: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
43a0: 74 20 73 61 74 69 73 66 79 20 74 68 65 20 66 6f  t satisfy the fo
43b0: 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f 6e 64 69  llowing precondi
43c0: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tions:.**.**    
43d0: 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  if pExpr->op==TK
43e0: 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d 3d 54 4b  _IS:      op==TK
43f0: 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49  _EQ and p5==SQLI
4400: 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20  TE_NULLEQ.**    
4410: 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  if pExpr->op==TK
4420: 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54 4b  _ISNOT:   op==TK
4430: 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49  _NE and p5==SQLI
4440: 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20  TE_NULLEQ.**    
4450: 6f 74 68 65 72 77 69 73 65 3a 20 20 20 20 20 20  otherwise:      
4460: 20 20 20 20 20 20 20 20 20 20 6f 70 3d 3d 70 45            op==pE
4470: 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70 35 3d 3d  xpr->op and p5==
4480: 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  0.*/.static void
4490: 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61   codeVectorCompa
44a0: 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
44b0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  rse,        /* C
44c0: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 6f  ode generator co
44d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
44e0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
44f0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
4500: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
4510: 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
4520: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
4530: 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 74 68   results into th
4540: 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  is register */. 
4550: 20 75 38 20 6f 70 2c 20 20 20 20 20 20 20 20 20   u8 op,         
4560: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
4570: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ison operator */
4580: 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
4590: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
45a0: 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20 7a 65 72  TE_NULLEQ or zer
45b0: 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  o */.){.  Vdbe *
45c0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
45d0: 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  e;.  Expr *pLeft
45e0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
45f0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20  .  Expr *pRight 
4600: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
4610: 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 73  .  int nLeft = s
4620: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
4630: 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 69  Size(pLeft);.  i
4640: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 4c  nt i;.  int regL
4650: 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  eft = 0;.  int r
4660: 65 67 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 75  egRight = 0;.  u
4670: 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 69 6e  8 opx = op;.  in
4680: 74 20 61 64 64 72 44 6f 6e 65 20 3d 20 73 71 6c  t addrDone = sql
4690: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
46a0: 6c 28 76 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  l(v);..  assert(
46b0: 20 6e 4c 65 66 74 3d 3d 73 71 6c 69 74 65 33 45   nLeft==sqlite3E
46c0: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52  xprVectorSize(pR
46d0: 69 67 68 74 29 20 29 3b 0a 20 20 61 73 73 65 72  ight) );.  asser
46e0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
46f0: 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _EQ || pExpr->op
4700: 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20 20  ==TK_NE .       
4710: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4720: 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IS || pExpr->op
4730: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 20  ==TK_ISNOT .    
4740: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
4750: 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d  =TK_LT || pExpr-
4760: 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20  >op==TK_GT .    
4770: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
4780: 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d  =TK_LE || pExpr-
4790: 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29 3b  >op==TK_GE .  );
47a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
47b0: 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45 78  ->op==op || (pEx
47c0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26 26  pr->op==TK_IS &&
47d0: 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20 20   op==TK_EQ).    
47e0: 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78 70          || (pExp
47f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
4800: 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b  && op==TK_NE) );
4810: 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d 30  .  assert( p5==0
4820: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f   || pExpr->op!=o
4830: 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p );.  assert( p
4840: 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  5==SQLITE_NULLEQ
4850: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f   || pExpr->op==o
4860: 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53 51  p );..  p5 |= SQ
4870: 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20 20  LITE_STOREP2;.  
4880: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29  if( opx==TK_LE )
4890: 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20   opx = TK_LT;.  
48a0: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29  if( opx==TK_GE )
48b0: 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20   opx = TK_GT;.. 
48c0: 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72 43   regLeft = exprC
48d0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
48e0: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 72  rse, pLeft);.  r
48f0: 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43 6f  egRight = exprCo
4900: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
4910: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20 20  se, pRight);..  
4920: 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f 6f  for(i=0; 1 /*Loo
4930: 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65 61  p exits by "brea
4940: 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  k"*/; i++){.    
4950: 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
4960: 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  , regFree2 = 0;.
4970: 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a 70      Expr *pL, *p
4980: 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c 20  R; .    int r1, 
4990: 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r2;.    assert( 
49a0: 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74 20  i>=0 && i<nLeft 
49b0: 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29  );.    if( i>0 )
49c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
49d0: 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
49e0: 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63 74     r1 = exprVect
49f0: 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72 73  orRegister(pPars
4a00: 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65 67  e, pLeft, i, reg
4a10: 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67 46  Left, &pL, &regF
4a20: 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d 20  ree1);.    r2 = 
4a30: 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74  exprVectorRegist
4a40: 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  er(pParse, pRigh
4a50: 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c 20  t, i, regRight, 
4a60: 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29 3b  &pR, &regFree2);
4a70: 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65  .    codeCompare
4a80: 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c  (pParse, pL, pR,
4a90: 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65   opx, r1, r2, de
4aa0: 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65 73  st, p5);.    tes
4ab0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
4ac0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4ad0: 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
4ae0: 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d     testcase(op==
4af0: 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
4b00: 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
4b10: 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Le);.    testcas
4b20: 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
4b30: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
4b40: 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 74  p==OP_Gt);.    t
4b50: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
4b60: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
4b70: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
4b80: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
4b90: 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f  ==OP_Eq); VdbeCo
4ba0: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4bb0: 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74 63  P_Eq);.    testc
4bc0: 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
4bd0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4be0: 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
4bf0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
4c00: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
4c10: 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73 71  egFree1);.    sq
4c20: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4c30: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
4c40: 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20 69  ree2);.    if( i
4c50: 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  >0 ) sqlite3Expr
4c60: 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
4c70: 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65  ;.    if( i==nLe
4c80: 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62 72  ft-1 ){.      br
4c90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
4ca0: 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b  f( opx==TK_EQ ){
4cb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4cc0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4cd0: 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64 72  fNot, dest, addr
4ce0: 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Done); VdbeCover
4cf0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35  age(v);.      p5
4d00: 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e   |= SQLITE_KEEPN
4d10: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ULL;.    }else i
4d20: 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b  f( opx==TK_NE ){
4d30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4d40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4d50: 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  f, dest, addrDon
4d60: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
4d70: 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d  (v);.      p5 |=
4d80: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
4d90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4da0: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54     assert( op==T
4db0: 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LT || op==TK_G
4dc0: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  T || op==TK_LE |
4dd0: 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  | op==TK_GE );. 
4de0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4df0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73  AddOp2(v, OP_Els
4e00: 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72 44  eNotEq, 0, addrD
4e10: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  one);.      Vdbe
4e20: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
4e30: 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
4e40: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4e50: 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20  , op==TK_GT);.  
4e60: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
4e70: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29  If(v, op==TK_LE)
4e80: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
4e90: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
4ea0: 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  _GE);.      if( 
4eb0: 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78  i==nLeft-2 ) opx
4ec0: 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d   = op;.    }.  }
4ed0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
4ee0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
4ef0: 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20  drDone);.}..#if 
4f00: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
4f10: 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  DEPTH>0./*.** Ch
4f20: 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e  eck that argumen
4f30: 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73  t nHeight is les
4f40: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
4f50: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  to the maximum.*
4f60: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
4f70: 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69  th allowed. If i
4f80: 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20  t is not, leave 
4f90: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
4fa0: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a   in.** pParse..*
4fb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
4fc0: 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72  rCheckHeight(Par
4fd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
4fe0: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20  nHeight){.  int 
4ff0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5000: 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d    int mxHeight =
5010: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
5020: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
5030: 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20  _EXPR_DEPTH];.  
5040: 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65  if( nHeight>mxHe
5050: 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
5060: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5070: 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70  se, .       "Exp
5080: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
5090: 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d  too large (maxim
50a0: 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d  um depth %d)", m
50b0: 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20  xHeight.    );. 
50c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
50d0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
50e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  rn rc;.}../* The
50f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65   following three
5100: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67   functions, heig
5110: 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67  htOfExpr(), heig
5120: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a  htOfExprList().*
5130: 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65  * and heightOfSe
5140: 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64  lect(), are used
5150: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
5160: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
5170: 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65  .** of any expre
5180: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
5190: 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72  enced by the str
51a0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
51b0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72   the.** first ar
51c0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
51d0: 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65   this maximum he
51e0: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
51f0: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
5200: 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a   value pointed.*
5210: 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74  * to by pnHeight
5220: 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  , the second par
5230: 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74  ameter, then set
5240: 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68   *pnHeight to th
5250: 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a  at.** value..*/.
5260: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5270: 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70  htOfExpr(Expr *p
5280: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5290: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
52a0: 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e   if( p->nHeight>
52b0: 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20  *pnHeight ){.   
52c0: 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70     *pnHeight = p
52d0: 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d  ->nHeight;.    }
52e0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
52f0: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  id heightOfExprL
5300: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
5310: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5320: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5330: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5340: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
5350: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67  i++){.      heig
5360: 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d  htOfExpr(p->a[i]
5370: 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74  .pExpr, pnHeight
5380: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  );.    }.  }.}.s
5390: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
53a0: 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74  tOfSelect(Select
53b0: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
53c0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
53d0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
53e0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65  (p->pWhere, pnHe
53f0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5400: 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69  tOfExpr(p->pHavi
5410: 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  ng, pnHeight);. 
5420: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5430: 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69  p->pLimit, pnHei
5440: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5450: 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65  OfExpr(p->pOffse
5460: 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, pnHeight);.  
5470: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
5480: 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e  st(p->pEList, pn
5490: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
54a0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
54b0: 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69  >pGroupBy, pnHei
54c0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
54d0: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  OfExprList(p->pO
54e0: 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74  rderBy, pnHeight
54f0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  );.    heightOfS
5500: 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c  elect(p->pPrior,
5510: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a   pnHeight);.  }.
5520: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5530: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
5540: 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74  riable in the st
5550: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
5560: 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  s an .** argumen
5570: 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  t. An expression
5580: 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65   with no childre
5590: 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72  n, Expr.pList or
55a0: 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63   .** Expr.pSelec
55b0: 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68  t member has a h
55c0: 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20  eight of 1. Any 
55d0: 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
55e0: 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74  .** has a height
55f0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61   equal to the ma
5600: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20  ximum height of 
5610: 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65  any other .** re
5620: 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c  ferenced Expr pl
5630: 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  us one..**.** Al
5640: 73 6f 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f  so propagate EP_
5650: 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20  Propagate flags 
5660: 75 70 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70  up from Expr.x.p
5670: 4c 69 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61  List to Expr.fla
5680: 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70  gs,.** if approp
5690: 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
56a0: 20 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69   void exprSetHei
56b0: 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ght(Expr *p){.  
56c0: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
56d0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
56e0: 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67  p->pLeft, &nHeig
56f0: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  ht);.  heightOfE
5700: 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26  xpr(p->pRight, &
5710: 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20  nHeight);.  if( 
5720: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5730: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
5740: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
5750: 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c  Select(p->x.pSel
5760: 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ect, &nHeight);.
5770: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78    }else if( p->x
5780: 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65  .pList ){.    he
5790: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
57a0: 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69  ->x.pList, &nHei
57b0: 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  ght);.    p->fla
57c0: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
57d0: 74 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72  te & sqlite3Expr
57e0: 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70  ListFlags(p->x.p
57f0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  List);.  }.  p->
5800: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
5810: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
5820: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
5830: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
5840: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
5850: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
5860: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
5870: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
5880: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
5890: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
58a0: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
58b0: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
58c0: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  arse..**.** Also
58d0: 20 70 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   propagate all E
58e0: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
58f0: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
5900: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
5910: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
5920: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5930: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
5940: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
5950: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5960: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
5970: 72 65 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65  return;.  exprSe
5980: 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71  tHeight(p);.  sq
5990: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65  lite3ExprCheckHe
59a0: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  ight(pParse, p->
59b0: 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a  nHeight);.}../*.
59c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61  ** Return the ma
59d0: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20  ximum height of 
59e0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  any expression t
59f0: 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a  ree referenced.*
5a00: 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20  * by the select 
5a10: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
5a20: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
5a30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
5a40: 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
5a50: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
5a60: 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20  t nHeight = 0;. 
5a70: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5a80: 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  p, &nHeight);.  
5a90: 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a  return nHeight;.
5aa0: 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45  }.#else /* ABOVE
5ab0: 3a 20 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63  :  Height enforc
5ac0: 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20  ement enabled.  
5ad0: 42 45 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e  BELOW: Height en
5ae0: 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f  forcement off */
5af0: 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65  ./*.** Propagate
5b00: 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74   all EP_Propagat
5b10: 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65  e flags from the
5b20: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e   Expr.x.pList in
5b30: 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73  to.** Expr.flags
5b40: 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
5b50: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
5b60: 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70  ndFlags(Parse *p
5b70: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b  Parse, Expr *p){
5b80: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78  .  if( p && p->x
5b90: 2e 70 4c 69 73 74 20 26 26 20 21 45 78 70 72 48  .pList && !ExprH
5ba0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5bb0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
5bc0: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5bd0: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5be0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5bf0: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5c00: 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78    }.}.#define ex
5c10: 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23  prSetHeight(y).#
5c20: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5c30: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
5c40: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
5c50: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63  routine is the c
5c60: 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f  ore allocator fo
5c70: 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a  r Expr nodes..**
5c80: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
5c90: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
5ca0: 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ode and return a
5cb0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20   pointer to it. 
5cc0: 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74   Memory.** for t
5cd0: 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72  his node and for
5ce0: 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75   the pToken argu
5cf0: 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65  ment is a single
5d00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f   allocation.** o
5d10: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5d20: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20  ite3DbMalloc(). 
5d30: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
5d40: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70  ction.** is resp
5d50: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
5d60: 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65  ng sure the node
5d70: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
5d80: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
5d90: 20 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65   dequote is true
5da0: 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e  , then the token
5db0: 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
5dc0: 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20  is dequoted..** 
5dd0: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61  If dequote is fa
5de0: 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e  lse, no dequotin
5df0: 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  g is performed. 
5e00: 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20   The deQuote.** 
5e10: 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
5e20: 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69  ored if pToken i
5e30: 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  s NULL or if the
5e40: 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a   token does not.
5e50: 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20  ** appear to be 
5e60: 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20  quoted.  If the 
5e70: 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74  quotes were of t
5e80: 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64  he form "..." (d
5e90: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a  ouble-quotes).**
5ea0: 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c   then the EP_Dbl
5eb0: 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73  Quoted flag is s
5ec0: 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  et on the expres
5ed0: 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sion node..**.**
5ee0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   Special case:  
5ef0: 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  If op==TK_INTEGE
5f00: 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69  R and pToken poi
5f10: 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20  nts to a string 
5f20: 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74  that.** can be t
5f30: 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61  ranslated into a
5f40: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
5f50: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
5f60: 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64  is not.** stored
5f70: 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49   in u.zToken.  I
5f80: 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65  nstead, the inte
5f90: 67 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72  ger values is wr
5fa0: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e  itten.** into u.
5fb0: 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45  iValue and the E
5fc0: 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20  P_IntValue flag 
5fd0: 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72  is set.  No extr
5fe0: 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20  a storage.** is 
5ff0: 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
6000: 64 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65  d the integer te
6010: 78 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f  xt and the dequo
6020: 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72  te flag is ignor
6030: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
6040: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20  ite3ExprAlloc(. 
6050: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
6060: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
6070: 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62  le for sqlite3Db
6080: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61  MallocZero() (ma
6090: 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20  y be null) */.  
60a0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
60b0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
60c0: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
60d0: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
60e0: 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b  Token,    /* Tok
60f0: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69  en argument.  Mi
6100: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
6110: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
6120: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
6130: 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29   to dequote */.)
6140: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
6150: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
6160: 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d  ;.  int iValue =
6170: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64   0;..  assert( d
6180: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54  b!=0 );.  if( pT
6190: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
61a0: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
61b0: 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20  | pToken->z==0. 
61c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
61d0: 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b  te3GetInt32(pTok
61e0: 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d  en->z, &iValue)=
61f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  =0 ){.      nExt
6200: 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31  ra = pToken->n+1
6210: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6220: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20  iValue>=0 );.   
6230: 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20   }.  }.  pNew = 
6240: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6250: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
6260: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
6270: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
6280: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
6290: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
62a0: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28      pNew->op = (
62b0: 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  u8)op;.    pNew-
62c0: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
62d0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
62e0: 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d      if( nExtra==
62f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 ){.        pNe
6300: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
6310: 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
6320: 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
6330: 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  = iValue;.      
6340: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
6350: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
6360: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
6370: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6380: 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c   pToken->z!=0 ||
6390: 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b   pToken->n==0 );
63a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f  .        if( pTo
63b0: 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28  ken->n ) memcpy(
63c0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  pNew->u.zToken, 
63d0: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
63e0: 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  n->n);.        p
63f0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54  New->u.zToken[pT
6400: 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  oken->n] = 0;.  
6410: 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74        if( dequot
6420: 65 20 26 26 20 73 71 6c 69 74 65 33 49 73 71 75  e && sqlite3Isqu
6430: 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  ote(pNew->u.zTok
6440: 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  en[0]) ){.      
6450: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e      if( pNew->u.
6460: 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29  zToken[0]=='"' )
6470: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
6480: 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20  EP_DblQuoted;.  
6490: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
64a0: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
64b0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
64c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
64d0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
64e0: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20  XPR_DEPTH>0.    
64f0: 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20  pNew->nHeight = 
6500: 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a  1;.#endif  .  }.
6510: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
6520: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
6530: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
6540: 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65  n node from a ze
6550: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f  ro-terminated to
6560: 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20  ken that has.** 
6570: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 71  already been deq
6580: 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  uoted..*/.Expr *
6590: 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73  sqlite3Expr(.  s
65a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
65b0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
65c0: 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61   for sqlite3DbMa
65d0: 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20  llocZero() (may 
65e0: 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  be null) */.  in
65f0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6600: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6610: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6620: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b  const char *zTok
6630: 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  en      /* Token
6640: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
6650: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
6660: 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a    Token x;.  x.z
6670: 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e   = zToken;.  x.n
6680: 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69   = zToken ? sqli
6690: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b  te3Strlen30(zTok
66a0: 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  en) : 0;.  retur
66b0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
66c0: 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30  oc(db, op, &x, 0
66d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61  );.}../*.** Atta
66e0: 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65 66  ch subtrees pLef
66f0: 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20  t and pRight to 
6700: 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52  the Expr node pR
6710: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52  oot..**.** If pR
6720: 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  oot==NULL that m
6730: 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f  eans that a memo
6740: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
6750: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
6760: 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73  ..** In that cas
6770: 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73 75  e, delete the su
6780: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
6790: 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64   pRight..*/.void
67a0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
67b0: 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73 71  chSubtrees(.  sq
67c0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70  lite3 *db,.  Exp
67d0: 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72  r *pRoot,.  Expr
67e0: 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20   *pLeft,.  Expr 
67f0: 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28  *pRight.){.  if(
6800: 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20   pRoot==0 ){.   
6810: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
6820: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
6830: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6840: 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  te(db, pLeft);. 
6850: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6860: 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29  lete(db, pRight)
6870: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
6880: 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  f( pRight ){.   
6890: 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74     pRoot->pRight
68a0: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
68b0: 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d   pRoot->flags |=
68c0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
68d0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20  pRight->flags;. 
68e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
68f0: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
6900: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
6910: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66  ;.      pRoot->f
6920: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
6930: 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c  gate & pLeft->fl
6940: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  ags;.    }.    e
6950: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52 6f  xprSetHeight(pRo
6960: 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ot);.  }.}../*.*
6970: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78  * Allocate an Ex
6980: 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f  pr node which jo
6990: 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  ins as many as t
69a0: 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a  wo subtrees..**.
69b0: 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  ** One or both o
69c0: 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20 63  f the subtrees c
69d0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74  an be NULL.  Ret
69e0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
69f0: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72   the new.** Expr
6a00: 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61   node.  Or, if a
6a10: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
6a20: 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e  rs, set pParse->
6a30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6a40: 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75  ,.** free the su
6a50: 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75 72  btrees and retur
6a60: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20  n NULL..*/.Expr 
6a70: 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20  *sqlite3PExpr(. 
6a80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
6aa0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
6ab0: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
6ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
6ad0: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
6ae0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
6af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
6b00: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
6b10: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20  Expr *pRight,   
6b20: 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
6b30: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f   operand */.  co
6b40: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
6b50: 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e  n     /* Argumen
6b60: 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20  t token */.){.  
6b70: 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f  Expr *p;.  if( o
6b80: 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50 61  p==TK_AND && pPa
6b90: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
6ba0: 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61      /* Take adva
6bb0: 6e 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63  ntage of short-c
6bc0: 69 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74  ircuit false opt
6bd0: 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e  imization for AN
6be0: 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c  D */.    p = sql
6bf0: 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
6c00: 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70  se->db, pLeft, p
6c10: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
6c20: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
6c30: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
6c40: 2d 3e 64 62 2c 20 6f 70 20 26 20 54 4b 46 4c 47  ->db, op & TKFLG
6c50: 5f 4d 41 53 4b 2c 20 70 54 6f 6b 65 6e 2c 20 31  _MASK, pToken, 1
6c60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6c70: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
6c80: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20  (pParse->db, p, 
6c90: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
6ca0: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a    }.  if( p ) {.
6cb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6cc0: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
6cd0: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
6ce0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
6cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65  }../*.** Add pSe
6d00: 6c 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72  lect to the Expr
6d10: 2e 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64  .x.pSelect field
6d20: 2e 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20  .  Or, if pExpr 
6d30: 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20  is NULL (due.** 
6d40: 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  do a memory allo
6d50: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20  cation failure) 
6d60: 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
6d70: 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a  pSelect object..
6d80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
6d90: 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61  ExprAddSelect(Pa
6da0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
6db0: 72 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74  r *pExpr, Select
6dc0: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66   *pSelect){.  if
6dd0: 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ( pExpr ){.    p
6de0: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
6df0: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45  = pSelect;.    E
6e00: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
6e10: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
6e20: 63 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b  ct|EP_Subquery);
6e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
6e40: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
6e50: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  s(pParse, pExpr)
6e60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
6e70: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
6e80: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6e90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
6ea0: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
6eb0: 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  e->db, pSelect);
6ec0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  .  }.}.../*.** I
6ed0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6ee0: 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
6ef0: 72 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20  r TRUE or FALSE 
6f00: 28 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a  (respectively),.
6f10: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31  ** then return 1
6f20: 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  .  If one cannot
6f30: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74   determine the t
6f40: 72 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68  ruth value of th
6f50: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
6f60: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
6f70: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
6f80: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
6f90: 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20  ization.  If is 
6fa0: 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68  OK to return 0 h
6fb0: 65 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74  ere even if.** t
6fc0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
6fd0: 61 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66  ally is always f
6fe0: 61 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61  alse or false (a
6ff0: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29   false negative)
7000: 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61  ..** But it is a
7010: 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31   bug to return 1
7020: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
7030: 6f 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69  on might have di
7040: 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65  fferent.** boole
7050: 61 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66  an values in dif
7060: 66 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61  ferent circumsta
7070: 6e 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f  nces (a false po
7080: 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e  sitive.).**.** N
7090: 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20  ote that if the 
70a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61  expression is pa
70b0: 72 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61  rt of conditiona
70c0: 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20  l for a.** LEFT 
70d0: 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61  JOIN, then we ca
70e0: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61  nnot determine a
70f0: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
7100: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
7110: 20 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66   is it true or f
7120: 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20  alse, so always 
7130: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
7140: 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61  tic int exprAlwa
7150: 79 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b  ysTrue(Expr *p){
7160: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
7170: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
7180: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
7190: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
71a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
71b0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
71c0: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
71d0: 20 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a   return v!=0;.}.
71e0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
71f0: 6c 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20  lwaysFalse(Expr 
7200: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
7210: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
7220: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
7230: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
7240: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
7250: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
7260: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
7270: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30  0;.  return v==0
7280: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
7290: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
72a0: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
72b0: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
72c0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
72d0: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
72e0: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
72f0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
7300: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64  **.** If one sid
7310: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
7320: 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f  f the AND is kno
7330: 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20  wn to be false, 
7340: 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20  then instead.** 
7350: 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  of returning an 
7360: 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  AND expression, 
7370: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
7380: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
7390: 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75  n with.** a valu
73a0: 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45  e of false..*/.E
73b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
73c0: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
73d0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
73e0: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
73f0: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
7400: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
7410: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
7420: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
7430: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
7440: 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
7450: 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20  aysFalse(pLeft) 
7460: 7c 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  || exprAlwaysFal
7470: 73 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  se(pRight) ){.  
7480: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7490: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
74a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
74b0: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
74c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
74d0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
74e0: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
74f0: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
7500: 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  [0], 0);.  }else
7510: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
7520: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
7530: 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20  loc(db, TK_AND, 
7540: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
7550: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
7560: 72 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70  rees(db, pNew, p
7570: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
7580: 20 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a     return pNew;.
7590: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
75a0: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
75b0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
75c0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
75d0: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67   multiple.** arg
75e0: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20  uments..*/.Expr 
75f0: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63  *sqlite3ExprFunc
7600: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
7610: 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  se, ExprList *pL
7620: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
7630: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
7640: 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  w;.  sqlite3 *db
7650: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7660: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20   assert( pToken 
7670: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
7680: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
7690: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54   TK_FUNCTION, pT
76a0: 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20  oken, 1);.  if( 
76b0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
76c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
76d0: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
76e0: 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79   /* Avoid memory
76f0: 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f   leak when mallo
7700: 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72  c fails */.    r
7710: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
7720: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
7730: 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
7740: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
7750: 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c  (pNew, EP_xIsSel
7760: 65 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  ect) );.  sqlite
7770: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
7780: 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70  dFlags(pParse, p
7790: 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  New);.  return p
77a0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  New;.}../*.** As
77b0: 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20  sign a variable 
77c0: 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70  number to an exp
77d0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63  ression that enc
77e0: 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a  odes a wildcard.
77f0: 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ** in the origin
7800: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
7810: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  .  .**.** Wildca
7820: 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  rds consisting o
7830: 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61  f a single "?" a
7840: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
7850: 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a  next sequential.
7860: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  ** variable numb
7870: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  er..**.** Wildca
7880: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
7890: 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67  "?nnn" are assig
78a0: 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22  ned the number "
78b0: 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a  nnn".  We make.*
78c0: 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20  * sure "nnn" is 
78d0: 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76  not too be to av
78e0: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
78f0: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
7900: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
7910: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
7920: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
7930: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
7940: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
7950: 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61  orm ":aaa", "@aa
7960: 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72  a", or "$aaa" ar
7970: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
7980: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
7990: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
79a0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
79b0: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
79c0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
79d0: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
79e0: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
79f0: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
7a00: 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20  ential variable 
7a10: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
7a20: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
7a30: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
7a40: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
7a50: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
7a60: 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Expr){.  sqlite3
7a70: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7a80: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
7a90: 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  *z;..  if( pExpr
7aa0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7ab0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
7ac0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
7ad0: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
7ae0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
7af0: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
7b00: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
7b10: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
7b20: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
7b30: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d  =0 );.  if( z[1]
7b40: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==0 ){.    /* Wi
7b50: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
7b60: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
7b70: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
7b80: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
7b90: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f  assert( z[0]=='?
7ba0: 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ' );.    pExpr->
7bb0: 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72  iColumn = (ynVar
7bc0: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
7bd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7be0: 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20  ynVar x = 0;.   
7bf0: 20 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33   u32 n = sqlite3
7c00: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
7c10: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
7c20: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
7c30: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
7c40: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
7c50: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
7c60: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a  eger and.      *
7c70: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
7c80: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7c90: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a  */.      i64 i;.
7ca0: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20        int bOk = 
7cb0: 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34  0==sqlite3Atoi64
7cc0: 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c  (&z[1], &i, n-1,
7cd0: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
7ce0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
7cf0: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
7d00: 29 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  )i;.      testca
7d10: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
7d20: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
7d30: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7d40: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7d50: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7d60: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
7d70: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
7d80: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
7d90: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7da0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
7db0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
7dc0: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
7dd0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
7de0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
7df0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
7e00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7e10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
7e20: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
7e30: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
7e40: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
7e50: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
7e60: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7e70: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
7e80: 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b  ;.        x = 0;
7e90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7ea0: 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61  f( i>pParse->nVa
7eb0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
7ec0: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74  rse->nVar = (int
7ed0: 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
7ee0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
7ef0: 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22  Wildcards like "
7f00: 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72  :aaa", "$aaa" or
7f10: 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20   "@aaa".  Reuse 
7f20: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
7f30: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65  e.      ** numbe
7f40: 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61  r as the prior a
7f50: 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65  ppearance of the
7f60: 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69   same name, or i
7f70: 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20  f the name.     
7f80: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
7f90: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
7fa0: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
7fb0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
7fc0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56      */.      ynV
7fd0: 61 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  ar i;.      for(
7fe0: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
7ff0: 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  zVar; i++){.    
8000: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
8010: 61 7a 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63  azVar[i] && strc
8020: 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  mp(pParse->azVar
8030: 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  [i],z)==0 ){.   
8040: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
8050: 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56  olumn = x = (ynV
8060: 61 72 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20  ar)i+1;.        
8070: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
8080: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
8090: 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20   if( x==0 ) x = 
80a0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
80b0: 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73   (ynVar)(++pPars
80c0: 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a  e->nVar);.    }.
80d0: 20 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20      if( x>0 ){. 
80e0: 20 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73       if( x>pPars
80f0: 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20  e->nzVar ){.    
8100: 20 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20      char **a;.  
8110: 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65        a = sqlite
8120: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
8130: 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a  Parse->azVar, x*
8140: 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20  sizeof(a[0]));. 
8150: 20 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20         if( a==0 
8160: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
8170: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
8180: 61 69 6c 65 64 20 29 3b 20 2f 2a 20 45 72 72 6f  ailed ); /* Erro
8190: 72 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75  r reported throu
81a0: 67 68 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  gh mallocFailed 
81b0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
81c0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
81d0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
81e0: 7a 56 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20  zVar = a;.      
81f0: 20 20 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72    memset(&a[pPar
8200: 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28  se->nzVar], 0, (
8210: 78 2d 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29  x-pParse->nzVar)
8220: 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a  *sizeof(a[0]));.
8230: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
8240: 6e 7a 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20  nzVar = x;.     
8250: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30   }.      if( z[0
8260: 5d 21 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65  ]!='?' || pParse
8270: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20  ->azVar[x-1]==0 
8280: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8290: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 50 61  e3DbFree(db, pPa
82a0: 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29  rse->azVar[x-1])
82b0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
82c0: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73  ->azVar[x-1] = s
82d0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
82e0: 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  db, z, n);.     
82f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20   }.    }.  } .  
8300: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72  if( !pParse->nEr
8310: 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61  r && pParse->nVa
8320: 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
8330: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8340: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
8350: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8360: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8370: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
8380: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
8390: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
83a0: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
83b0: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  on tree..*/.stat
83c0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
83d0: 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  NE void sqlite3E
83e0: 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  xprDeleteNN(sqli
83f0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
8400: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
8410: 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  0 );.  /* Sanity
8420: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
8430: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
8440: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
8450: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
8460: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
8470: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8480: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
8490: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
84a0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
84b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
84c0: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
84d0: 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e  /* The Expr.x un
84e0: 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65  ion is never use
84f0: 64 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  d at the same ti
8500: 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68  me as Expr.pRigh
8510: 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
8520: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
8530: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
8540: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
8550: 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f  ft && p->op!=TK_
8560: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20  SELECT_COLUMN ) 
8570: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8580: 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  eNN(db, p->pLeft
8590: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
85a0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
85b0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  pRight);.    if(
85c0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
85d0: 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  (p, EP_MemToken)
85e0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
85f0: 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  (db, p->u.zToken
8600: 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
8610: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8620: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
8630: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
8640: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
8650: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
8660: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
8670: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8680: 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73  te(db, p->x.pLis
8690: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
86a0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
86b0: 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69  erty(p, EP_Stati
86c0: 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c) ){.    sqlite
86d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
86e0: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
86f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c  e3ExprDelete(sql
8700: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
8710: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71  p){.  if( p ) sq
8720: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8730: 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  N(db, p);.}../*.
8740: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
8750: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
8760: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
8770: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
8780: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
8790: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
87a0: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
87b0: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
87c0: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
87d0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
87e0: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
87f0: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
8800: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
8810: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
8820: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8830: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
8840: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
8850: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
8860: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
8870: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
8880: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
8890: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
88a0: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
88b0: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
88c0: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
88d0: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
88e0: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
88f0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8900: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
8910: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
8920: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
8930: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8940: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
8950: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
8960: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
8970: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
8980: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8990: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
89a0: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
89b0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
89c0: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
89d0: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
89e0: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
89f0: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
8a00: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
8a10: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
8a20: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
8a30: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
8a40: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
8a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
8a90: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8aa0: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
8ab0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
8ac0: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
8ad0: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
8ae0: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
8af0: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
8b00: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
8b10: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
8b20: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
8b30: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
8b40: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
8b50: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
8b60: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
8b70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
8b80: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
8b90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
8ba0: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
8bb0: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
8bc0: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
8bd0: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
8be0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
8bf0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
8c00: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8c10: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
8c20: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
8c30: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
8c40: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
8c50: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
8c60: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
8c70: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
8c80: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
8c90: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
8ca0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
8cb0: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
8cc0: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
8cd0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
8ce0: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
8cf0: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
8d00: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
8d10: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
8d20: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
8d30: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
8d40: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
8d50: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
8d60: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
8d70: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
8d80: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
8d90: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
8da0: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
8db0: 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74   teh Expr object
8dc0: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
8dd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
8de0: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
8df0: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
8e00: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
8e10: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
8e20: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
8e30: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
8e40: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
8e50: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
8e60: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
8e70: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
8e80: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
8e90: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
8ea0: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
8eb0: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
8ec0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
8ed0: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
8ee0: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
8ef0: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
8f00: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
8f10: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
8f20: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
8f30: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
8f40: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
8f50: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
8f60: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
8f70: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
8f80: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
8f90: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
8fa0: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
8fb0: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
8fc0: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
8fd0: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
8fe0: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
8ff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
9000: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
9010: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
9020: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66  =0 );.  if( 0==f
9030: 6c 61 67 73 20 29 7b 0a 20 20 20 20 6e 53 69 7a  lags ){.    nSiz
9040: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
9050: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
9060: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9070: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
9080: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
9090: 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ced) );.    asse
90a0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
90b0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
90c0: 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73  oin) ); .    ass
90d0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
90e0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
90f0: 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73  oken) );.    ass
9100: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9110: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
9120: 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28  duce) );.    if(
9130: 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e   p->pLeft || p->
9140: 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  x.pList ){.     
9150: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45   nSize = EXPR_RE
9160: 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52  DUCEDSIZE | EP_R
9170: 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73  educed;.    }els
9180: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
9190: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
91a0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
91b0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
91c0: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
91d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
91e0: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
91f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9200: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
9210: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
9220: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
9230: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
9240: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
9250: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
9260: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
9270: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
9280: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
9290: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
92a0: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
92b0: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
92c0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
92d0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
92e0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
92f0: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
9300: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
9310: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9320: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
9330: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
9340: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
9350: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
9360: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
9370: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
9380: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
9390: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
93a0: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
93b0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
93c0: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
93d0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
93e0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
93f0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
9400: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
9410: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
9420: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
9430: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
9440: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
9450: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
9460: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
9470: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
9480: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
9490: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
94a0: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
94b0: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
94c0: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
94d0: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
94e0: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
94f0: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
9500: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
9510: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
9520: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
9530: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
9540: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
9550: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
9560: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
9570: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
9580: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
9590: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
95a0: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
95b0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
95c0: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
95d0: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
95e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
95f0: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
9600: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
9610: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
9620: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
9630: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
9640: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
9650: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
9660: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
9670: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
9680: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
9690: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
96a0: 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53  gs) + dupedExprS
96b0: 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66  ize(p->pRight, f
96c0: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
96d0: 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b  .  return nByte;
96e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
96f0: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
9700: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ar to sqlite3Exp
9710: 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74  rDup(), except t
9720: 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20  hat if pzBuffer 
9730: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  .** is not NULL 
9740: 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69  then *pzBuffer i
9750: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
9760: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c  nt to a buffer l
9770: 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20  arge enough .** 
9780: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
9790: 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
97a0: 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  p, the copies of
97b0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20   p->u.zToken.** 
97c0: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
97d0: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
97e0: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
97f0: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
9800: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
9810: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
9820: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
9830: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
9840: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
9850: 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f  the.** portion o
9860: 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70  f the buffer cop
9870: 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73  ied into by this
9880: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
9890: 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44  atic Expr *exprD
98a0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
98b0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 64 75 70  Expr *p, int dup
98c0: 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75  Flags, u8 **pzBu
98d0: 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70  ffer){.  Expr *p
98e0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
98f0: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
9900: 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f  n */.  u8 *zAllo
9910: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
9920: 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 66 72 6f  Memory space fro
9930: 6d 20 77 68 69 63 68 20 74 6f 20 62 75 69 6c 64  m which to build
9940: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a   Expr object */.
9950: 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67    u32 staticFlag
9960: 3b 20 20 20 20 20 20 20 2f 2a 20 45 50 5f 53 74  ;       /* EP_St
9970: 61 74 69 63 20 69 66 20 73 70 61 63 65 20 6e 6f  atic if space no
9980: 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
9990: 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73  malloc */..  ass
99a0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
99b0: 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61  assert( p );.  a
99c0: 73 73 65 72 74 28 20 64 75 70 46 6c 61 67 73 3d  ssert( dupFlags=
99d0: 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d  =0 || dupFlags==
99e0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
99f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 42 75  ;.  assert( pzBu
9a00: 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c  ffer==0 || dupFl
9a10: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
9a20: 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  UCE );..  /* Fig
9a30: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f  ure out where to
9a40: 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45   write the new E
9a50: 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a  xpr structure. *
9a60: 2f 0a 20 20 69 66 28 20 70 7a 42 75 66 66 65 72  /.  if( pzBuffer
9a70: 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d   ){.    zAlloc =
9a80: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
9a90: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f  staticFlag = EP_
9aa0: 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b  Static;.  }else{
9ab0: 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71  .    zAlloc = sq
9ac0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
9ad0: 4e 4e 28 64 62 2c 20 64 75 70 65 64 45 78 70 72  NN(db, dupedExpr
9ae0: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
9af0: 29 29 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c  ));.    staticFl
9b00: 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  ag = 0;.  }.  pN
9b10: 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c  ew = (Expr *)zAl
9b20: 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77  loc;..  if( pNew
9b30: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e   ){.    /* Set n
9b40: 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73  NewSize to the s
9b50: 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ize allocated fo
9b60: 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  r the structure 
9b70: 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a  pointed to.    *
9b80: 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20  * by pNew. This 
9b90: 69 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46  is either EXPR_F
9ba0: 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45  ULLSIZE, EXPR_RE
9bb0: 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20  DUCEDSIZE or.   
9bc0: 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   ** EXPR_TOKENON
9bd0: 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69  LYSIZE. nToken i
9be0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
9bf0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e  ber of bytes con
9c00: 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  sumed.    ** by 
9c10: 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
9c20: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
9c30: 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  ng (if any)..   
9c40: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
9c50: 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69  signed nStructSi
9c60: 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  ze = dupedExprSt
9c70: 72 75 63 74 53 69 7a 65 28 70 2c 20 64 75 70 46  ructSize(p, dupF
9c80: 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74  lags);.    const
9c90: 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20   int nNewSize = 
9ca0: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 30 78  nStructSize & 0x
9cb0: 66 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f  fff;.    int nTo
9cc0: 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 21 45 78  ken;.    if( !Ex
9cd0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9ce0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9cf0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9d00: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73        nToken = s
9d10: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
9d20: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b  ->u.zToken) + 1;
9d30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9d40: 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20    nToken = 0;.  
9d50: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 75 70 46    }.    if( dupF
9d60: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 61 73  lags ){.      as
9d70: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
9d80: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
9d90: 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ced)==0 );.     
9da0: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
9db0: 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20  p, nNewSize);.  
9dc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
9dd0: 33 32 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29  32 nSize = (u32)
9de0: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
9df0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
9e00: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65  zAlloc, p, nSize
9e10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69  );.      if( nSi
9e20: 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  ze<EXPR_FULLSIZE
9e30: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 6d 65 6d   ){ .        mem
9e40: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
9e50: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
9e60: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
9e70: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
9e80: 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65  /* Set the EP_Re
9e90: 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f  duced, EP_TokenO
9ea0: 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74  nly, and EP_Stat
9eb0: 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72  ic flags appropr
9ec0: 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70  iately. */.    p
9ed0: 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28  New->flags &= ~(
9ee0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9ef0: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69  kenOnly|EP_Stati
9f00: 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a  c|EP_MemToken);.
9f10: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
9f20: 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26  |= nStructSize &
9f30: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
9f40: 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20  TokenOnly);.    
9f50: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73  pNew->flags |= s
9f60: 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20  taticFlag;..    
9f70: 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75  /* Copy the p->u
9f80: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20  .zToken string, 
9f90: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
9fa0: 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( nToken ){.   
9fb0: 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20     char *zToken 
9fc0: 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  = pNew->u.zToken
9fd0: 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f   = (char*)&zAllo
9fe0: 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20  c[nNewSize];.   
9ff0: 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e     memcpy(zToken
a000: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e  , p->u.zToken, n
a010: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  Token);.    }.. 
a020: 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66     if( 0==((p->f
a030: 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73  lags|pNew->flags
a040: 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ) & EP_TokenOnly
a050: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
a060: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
a070: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
a080: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
a090: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
a0a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a0b0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
a0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
a0d0: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
a0e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a0f0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
a100: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a120: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
a130: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a140: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
a150: 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  st, dupFlags);. 
a160: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a170: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
a180: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
a190: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
a1a0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a1b0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
a1c0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a1d0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  nly) ){.      zA
a1e0: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a1f0: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a200: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a210: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a220: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
a230: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ed) ){.        p
a240: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e  New->pLeft = p->
a250: 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20 20  pLeft ?.        
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
a270: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
a280: 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ft, EXPRDUP_REDU
a290: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30  CE, &zAlloc) : 0
a2a0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
a2b0: 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67  pRight = p->pRig
a2c0: 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  ht ?.           
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72              expr
a2e0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  Dup(db, p->pRigh
a2f0: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
a300: 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b  E, &zAlloc) : 0;
a310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a320: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
a330: 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72         *pzBuffer
a340: 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = zAlloc;.     
a350: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
a360: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a370: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
a380: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
a390: 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f       if( pNew->o
a3a0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
a3b0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
a3c0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
a3d0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
a3e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a3f0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
a400: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a410: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
a420: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a430: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a440: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a450: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
a460: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
a470: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
a480: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
a490: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
a4a0: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
a4b0: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
a4c0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
a4d0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
a4e0: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
a4f0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
a500: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
a510: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
a520: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
a530: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
a540: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
a550: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
a560: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
a570: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
a580: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
a590: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
a5a0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
a5b0: 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28  of(*p) + sizeof(
a5c0: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
a5d0: 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74  Cte-1);.    pRet
a5e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a5f0: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
a600: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  );.    if( pRet 
a610: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
a620: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65        pRet->nCte
a630: 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20   = p->nCte;.    
a640: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a650: 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
a660: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70      pRet->a[i].p
a670: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
a680: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
a690: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30  >a[i].pSelect, 0
a6a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
a6b0: 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71  >a[i].pCols = sq
a6c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a6d0: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f  (db, p->a[i].pCo
a6e0: 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ls, 0);.        
a6f0: 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pRet->a[i].zName
a700: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
a710: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  up(db, p->a[i].z
a720: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
a730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a740: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
a750: 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70  # define withDup
a760: 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a  (x,y) 0.#endif..
a770: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a780: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
a790: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
a7a0: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
a7b0: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
a7c0: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
a7d0: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
a7e0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
a7f0: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
a800: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
a810: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
a820: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
a830: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
a840: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
a850: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
a860: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
a870: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
a880: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
a890: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
a8a0: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
a8b0: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
a8c0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
a8d0: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
a8e0: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
a8f0: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
a900: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
a910: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
a920: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
a930: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
a940: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
a950: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
a960: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
a970: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
a980: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
a990: 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
a9a0: 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74  tains a combinat
a9b0: 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44  ion of the EXPRD
a9c0: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
a9d0: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
a9e0: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
a9f0: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  et, then the str
aa00: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
aa10: 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65  is a.** truncate
aa20: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
aa30: 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75   usual Expr stru
aa40: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
aa50: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
aa60: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
aa70: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
aa80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
aa90: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  base schema..*/.
aaa0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
aab0: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
aac0: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
aad0: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
aae0: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
aaf0: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
ab00: 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  CE );.  return p
ab10: 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   ? exprDup(db, p
ab20: 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b  , flags, 0) : 0;
ab30: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
ab40: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
ab50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
ab60: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  rList *p, int fl
ab70: 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ags){.  ExprList
ab80: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
ab90: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
aba0: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
abb0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
abc0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
abd0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
abe0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
abf0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
ac00: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
ac10: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
ac20: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
ac30: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
ac40: 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  = i = p->nExpr;.
ac50: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 45    if( (flags & E
ac60: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d  XPRDUP_REDUCE)==
ac70: 30 20 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  0 ) for(i=1; i<p
ac80: 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d  ->nExpr; i+=i){}
ac90: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74  .  pNew->a = pIt
aca0: 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  em = sqlite3DbMa
acb0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20 69  llocRawNN(db,  i
acc0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
acd0: 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d   );.  if( pItem=
ace0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
acf0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77  3DbFree(db, pNew
ad00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
ad10: 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d  .  } .  pOldItem
ad20: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
ad30: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
ad40: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
ad50: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
ad60: 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20  xpr *pOldExpr = 
ad70: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b  pOldItem->pExpr;
ad80: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
ad90: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
ada0: 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c  up(db, pOldExpr,
adb0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74   flags);.    pIt
adc0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
add0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
ade0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
adf0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
ae00: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
ae10: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
ae20: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
ae30: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
ae40: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
ae50: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
ae60: 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ->done = 0;.    
ae70: 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  pItem->bSpanIsTa
ae80: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53  b = pOldItem->bS
ae90: 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49  panIsTab;.    pI
aea0: 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65  tem->u = pOldIte
aeb0: 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75  m->u;.  }.  retu
aec0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
aed0: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
aee0: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
aef0: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
af00: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
af10: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
af20: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
af30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
af40: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
af50: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
af60: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
af70: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
af80: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
af90: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
afa0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
afb0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
afc0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
afd0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
afe0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
aff0: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
b000: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b010: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
b020: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
b030: 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  rcListDup(sqlite
b040: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
b050: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
b060: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
b070: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
b080: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
b090: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
b0a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b0b0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
b0c0: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
b0d0: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
b0e0: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
b0f0: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
b100: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b110: 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20  RawNN(db, nByte 
b120: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
b130: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b140: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
b150: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
b160: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
b170: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
b180: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
b190: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
b1a0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
b1b0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
b1c0: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
b1d0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
b1e0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
b1f0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
b200: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
b210: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
b220: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
b230: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
b240: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b250: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
b260: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
b270: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
b280: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b290: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
b2a0: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
b2b0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b2c0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b2d0: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
b2e0: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
b2f0: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
b300: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
b310: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
b320: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
b330: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
b340: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
b350: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
b360: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
b370: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
b380: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
b390: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
b3a0: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
b3b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
b3c0: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
b3d0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
b3e0: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
b3f0: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
b400: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
b410: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
b420: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
b430: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
b440: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
b450: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
b460: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
b470: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b480: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
b490: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
b4a0: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
b4b0: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
b4c0: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
b4d0: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
b4e0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
b4f0: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
b500: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
b510: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
b520: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b530: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b540: 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b  pSelect, flags);
b550: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
b560: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
b570: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b580: 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20  ->pOn, flags);. 
b590: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
b5a0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
b5b0: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
b5c0: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
b5d0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
b5e0: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
b5f0: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
b600: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
b610: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
b620: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
b630: 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a  db, IdList *p){.
b640: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
b650: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
b660: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
b670: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
b680: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
b690: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b6a0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
b6b0: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
b6c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b6d0: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
b6e0: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
b6f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
b700: 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49  cRawNN(db, p->nI
b710: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
b720: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
b730: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
b740: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
b750: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
b760: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74   0;.  }.  /* Not
b770: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74  e that because t
b780: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
b790: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d  llocation for p-
b7a0: 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  >a[] is not.  **
b7b0: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70   necessarily a p
b7c0: 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c  ower of two, sql
b7d0: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
b7e0: 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61  () may not be ca
b7f0: 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lled.  ** on the
b800: 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74   duplicate creat
b810: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
b820: 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ion. */.  for(i=
b830: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
b840: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
b850: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
b860: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
b870: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
b880: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
b890: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
b8a0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
b8b0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
b8c0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b8d0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
b8e0: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
b8f0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
b900: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
b910: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
b920: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
b930: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
b940: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
b950: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c  .  Select *pNew,
b960: 20 2a 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65   *pPrior;.  asse
b970: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
b980: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b990: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
b9a0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b9b0: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29  N(db, sizeof(*p)
b9c0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
b9d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b9e0: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
b9f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
ba00: 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
ba10: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
ba20: 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
ba30: 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  rcListDup(db, p-
ba40: 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20  >pSrc, flags);. 
ba50: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
ba60: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
ba70: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c  b, p->pWhere, fl
ba80: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  ags);.  pNew->pG
ba90: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
baa0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
bab0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
bac0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  gs);.  pNew->pHa
bad0: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
bae0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
baf0: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
bb00: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
bb10: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
bb20: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
bb30: 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  rBy, flags);.  p
bb40: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
bb50: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
bb60: 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  = pPrior = sqlit
bb70: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
bb80: 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73  p->pPrior, flags
bb90: 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20  );.  if( pPrior 
bba0: 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
bbb0: 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
bbc0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65  pNext = 0;.  pNe
bbd0: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
bbe0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
bbf0: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
bc00: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
bc10: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
bc20: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
bc30: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
bc40: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
bc50: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
bc60: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46   0;.  pNew->selF
bc70: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
bc80: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
bc90: 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e  emeral;.  pNew->
bca0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
bcb0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
bcc0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
bcd0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c  -1;.  pNew->nSel
bce0: 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c  ectRow = p->nSel
bcf0: 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e  ectRow;.  pNew->
bd00: 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28  pWith = withDup(
bd10: 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20  db, p->pWith);. 
bd20: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
bd30: 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a  tName(pNew, p->z
bd40: 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  SelName);.  retu
bd50: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
bd60: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
bd70: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
bd80: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
bd90: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
bda0: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
bdb0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
bdc0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
bdd0: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
bde0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
bdf0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
be00: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
be10: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
be20: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
be30: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
be40: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
be50: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
be60: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
be70: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
be80: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
be90: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
bea0: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
beb0: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
bec0: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
bed0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
bee0: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
bef0: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
bf00: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
bf10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
bf20: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
bf30: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
bf40: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
bf50: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
bf60: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
bf70: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
bf80: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
bf90: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
bfa0: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
bfb0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
bfc0: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
bfd0: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
bfe0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
bff0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c000: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
c010: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
c020: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
c030: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
c040: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
c050: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
c060: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
c070: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
c080: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
c090: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
c0a0: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d   = 0;.    pList-
c0b0: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
c0c0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c0d0: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
c0e0: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
c0f0: 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  t->a==0 ) goto n
c100: 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69  o_mem;.  }else i
c110: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
c120: 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72   & (pList->nExpr
c130: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  -1))==0 ){.    s
c140: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c150: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65  tem *a;.    asse
c160: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
c170: 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71  >0 );.    a = sq
c180: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
c190: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  b, pList->a, pLi
c1a0: 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65  st->nExpr*2*size
c1b0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
c1c0: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
c1d0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
c1e0: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
c1f0: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
c200: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
c210: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
c220: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
c230: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
c240: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
c250: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
c260: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
c270: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
c280: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
c290: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
c2a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
c2b0: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
c2c0: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
c2d0: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
c2e0: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
c2f0: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
c300: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
c310: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
c320: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
c330: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
c340: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c350: 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78  pColumns and pEx
c360: 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72  pr form a vector
c370: 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63   assignment whic
c380: 68 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  h is part of the
c390: 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f   SET.** clause o
c3a0: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
c3b0: 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69  ement.  Like thi
c3c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
c3d0: 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31  (a,b,c) = (expr1
c3e0: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
c3f0: 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20   Or:    (a,b,c) 
c400: 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20  = (SELECT x,y,z 
c410: 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  FROM ....).**.**
c420: 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f   For each term o
c430: 66 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73  f the vector ass
c440: 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20  ignment, append 
c450: 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74  new entries to t
c460: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
c470: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e   list pList.  In
c480: 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73   the case of a s
c490: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 4c  ubquery on the L
c4a0: 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b  HS, append.** TK
c4b0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65  _SELECT_COLUMN e
c4c0: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45  xpressions..*/.E
c4d0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
c4e0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65  ExprListAppendVe
c4f0: 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ctor(.  Parse *p
c500: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
c510: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c520: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
c530: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  *pList,       /*
c540: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
c550: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
c560: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c  be NULL */.  IdL
c570: 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20  ist *pColumns,  
c580: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e      /* List of n
c590: 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74  ames of LHS of t
c5a0: 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f  he assignment */
c5b0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
c5c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63            /* Vec
c5d0: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74  tor expression t
c5e0: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
c5f0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c600: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c610: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c620: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b   int n;.  int i;
c630: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
c640: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
c650: 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70  Expr : 0;.  /* p
c660: 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79  Columns can only
c670: 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20   be NULL due to 
c680: 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f  an OOM but an OO
c690: 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a  M will cause an.
c6a0: 20 20 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20    ** exit prior 
c6b0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
c6c0: 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f  being invoked */
c6d0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f  .  if( NEVER(pCo
c6e0: 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f  lumns==0) ) goto
c6f0: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
c700: 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70  rror;.  if( pExp
c710: 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74  r==0 ) goto vect
c720: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
c730: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  .  n = sqlite3Ex
c740: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
c750: 70 72 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 75  pr);.  if( pColu
c760: 6d 6e 73 2d 3e 6e 49 64 21 3d 6e 20 29 7b 0a 20  mns->nId!=n ){. 
c770: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c780: 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63  sg(pParse, "%d c
c790: 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20  olumns assigned 
c7a0: 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20  %d values",.    
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e  pColumns->nId, n
c7d0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65 63 74  );.    goto vect
c7e0: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
c7f0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
c800: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  i<n; i++){.    E
c810: 78 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20  xpr *pSubExpr = 
c820: 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65  sqlite3ExprForVe
c830: 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65  ctorField(pParse
c840: 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20  , pExpr, i);.   
c850: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
c860: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
c870: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53  Parse, pList, pS
c880: 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ubExpr);.    if(
c890: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
c8a0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
c8b0: 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31  Expr==iFirst+i+1
c8c0: 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   );.      pList-
c8d0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
c8e0: 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75  1].zName = pColu
c8f0: 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  mns->a[i].zName;
c900: 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d  .      pColumns-
c910: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b  >a[i].zName = 0;
c920: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c930: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
c940: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 69 66 28  ELECT ){.    if(
c950: 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d   pList && pList-
c960: 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72  >a[iFirst].pExpr
c970: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c980: 28 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73  ( pList->a[iFirs
c990: 74 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t].pExpr->op==TK
c9a0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
c9b0: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ;.      pList->a
c9c0: 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 2d 3e  [iFirst].pExpr->
c9d0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a  pRight = pExpr;.
c9e0: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b        pExpr = 0;
c9f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 76 65 63 74  .    }.  }..vect
ca00: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a  or_append_error:
ca10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
ca20: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
ca30: 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
ca40: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75  Delete(db, pColu
ca50: 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  mns);.  return p
ca60: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  List;.}../*.** S
ca70: 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65  et the sort orde
ca80: 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65  r for the last e
ca90: 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69  lement on the gi
caa0: 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f  ven ExprList..*/
cab0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
cac0: 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65  rListSetSortOrde
cad0: 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  r(ExprList *p, i
cae0: 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a  nt iSortOrder){.
caf0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
cb00: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53  urn;.  assert( S
cb10: 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e  QLITE_SO_UNDEFIN
cb20: 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53  ED<0 && SQLITE_S
cb30: 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49  O_ASC>=0 && SQLI
cb40: 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a  TE_SO_DESC>0 );.
cb50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78    assert( p->nEx
cb60: 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53  pr>0 );.  if( iS
cb70: 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20  ortOrder<0 ){.  
cb80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70    assert( p->a[p
cb90: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f  ->nExpr-1].sortO
cba0: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
cbb0: 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ASC );.    retur
cbc0: 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d  n;.  }.  p->a[p-
cbd0: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
cbe0: 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f  der = (u8)iSortO
cbf0: 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rder;.}../*.** S
cc00: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
cc10: 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e  a[].zName elemen
cc20: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
cc30: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
cc40: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
cc50: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
cc60: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
cc70: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
cc80: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
cc90: 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64  But pName should
cca0: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
ccb0: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
ccc0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
ccd0: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
cce0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
ccf0: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
cd00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
cd10: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20  prListSetName(. 
cd20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
cd30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
cd40: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
cd50: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
cd60: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
cd70: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
cd80: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
cd90: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
cda0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
cdb0: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20  to be added */. 
cdc0: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
cdd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
cde0: 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61   to cause the na
cdf0: 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65  me to be dequote
ce00: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
ce10: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50  ( pList!=0 || pP
ce20: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
ce30: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
ce40: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
ce50: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
ce60: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
ce70: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
ce80: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70  nExpr>0 );.    p
ce90: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
cea0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
ceb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
cec0: 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b  tem->zName==0 );
ced0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
cee0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
cef0: 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  NDup(pParse->db,
cf00: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
cf10: 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65  ->n);.    if( de
cf20: 71 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44  quote ) sqlite3D
cf30: 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e  equote(pItem->zN
cf40: 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ame);.  }.}../*.
cf50: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c  ** Set the ExprL
cf60: 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c  ist.a[].zSpan el
cf70: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73  ement of the mos
cf80: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
cf90: 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20   item.** on the 
cfa0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
cfb0: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67  .**.** pList mig
cfc0: 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f  ht be NULL follo
cfd0: 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  wing an OOM erro
cfe0: 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68  r.  But pSpan sh
cff0: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a  ould never be.**
d000: 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d   NULL.  If a mem
d010: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
d020: 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65  ails, the pParse
d030: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
d040: 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65  ed flag.** is se
d050: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d060: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61  e3ExprListSetSpa
d070: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
d080: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
d090: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d0a0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d0b0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
d0c0: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
d0d0: 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a   add the span. *
d0e0: 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53  /.  ExprSpan *pS
d0f0: 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54  pan         /* T
d100: 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64  he span to be ad
d110: 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ded */.){.  sqli
d120: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d130: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
d140: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e  pList!=0 || db->
d150: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
d160: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
d170: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
d180: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
d190: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
d1a0: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
d1b0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
d1c0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
d1d0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
d1e0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74  locFailed || pIt
d1f0: 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e  em->pExpr==pSpan
d200: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73  ->pExpr );.    s
d210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d220: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
d230: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
d240: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
d250: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
d260: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20  Span->zStart,.  
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a    (int)(pSpan->z
d2a0: 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74  End - pSpan->zSt
d2b0: 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  art));.  }.}../*
d2c0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
d2d0: 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73  ssion list pELis
d2e0: 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  t contains more 
d2f0: 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d  than iLimit elem
d300: 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  ents,.** leave a
d310: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
d320: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
d330: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
d340: 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20  stCheckLength(. 
d350: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
d360: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
d370: 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  st,.  const char
d380: 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69   *zObject.){.  i
d390: 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e  nt mx = pParse->
d3a0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
d3b0: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b  E_LIMIT_COLUMN];
d3c0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
d3d0: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
d3e0: 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65  Expr==mx );.  te
d3f0: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
d400: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
d410: 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  =mx+1 );.  if( p
d420: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
d430: 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20  >nExpr>mx ){.   
d440: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d450: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
d460: 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73  ny columns in %s
d470: 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d  ", zObject);.  }
d480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
d490: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
d4a0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73  ssion list..*/.s
d4b0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
d4c0: 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c  NLINE void exprL
d4d0: 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  istDeleteNN(sqli
d4e0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
d4f0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
d500: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
d510: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
d520: 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  m;.  assert( pLi
d530: 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73  st->a!=0 || pLis
d540: 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20  t->nExpr==0 );. 
d550: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
d560: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
d570: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
d580: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
d590: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
d5a0: 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  b, pItem->pExpr)
d5b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
d5c0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
d5d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
d5e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
d5f0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a  em->zSpan);.  }.
d600: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d610: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
d620: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d630: 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69  b, pList);.}.voi
d640: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
d650: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
d660: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
d670: 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69  List){.  if( pLi
d680: 73 74 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c  st ) exprListDel
d690: 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29  eteNN(db, pList)
d6a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
d6b0: 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52  n the bitwise-OR
d6c0: 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61   of all Expr.fla
d6d0: 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  gs fields in the
d6e0: 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69   given.** ExprLi
d6f0: 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  st..*/.u32 sqlit
d700: 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
d710: 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a  const ExprList *
d720: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
d730: 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20  .  u32 m = 0;.  
d740: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
d750: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
d760: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
d770: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
d780: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
d790: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 61  .pExpr;.       a
d7a0: 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
d7b0: 29 3b 0a 20 20 20 20 20 20 20 6d 20 7c 3d 20 70  );.       m |= p
d7c0: 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Expr->flags;.   
d7d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
d7e0: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  m;.}../*.** Thes
d7f0: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57  e routines are W
d800: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  alker callbacks 
d810: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78  used to check ex
d820: 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20  pressions to.** 
d830: 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20  see if they are 
d840: 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73  "constant" for s
d850: 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ome definition o
d860: 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65  f constant.  The
d870: 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  .** Walker.eCode
d880: 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65   value determine
d890: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63  s the type of "c
d8a0: 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20  onstant" we are 
d8b0: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a  looking.** for..
d8c0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
d8d0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
d8e0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
d8f0: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
d900: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
d910: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
d920: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
d930: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
d940: 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73  Code==1.**     s
d950: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
d960: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20  tantNotJoin()   
d970: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
d980: 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20  >eCode==2.**    
d990: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
d9a0: 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  bleConstant()   
d9b0: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
d9c0: 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20  r->eCode==3.**  
d9d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
d9e0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
d9f0: 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c  on()        pWal
da00: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
da10: 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20   5.**.** In all 
da20: 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62  cases, the callb
da30: 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e  acks set Walker.
da40: 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72  eCode=0 and abor
da50: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
da60: 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20  ion.** is found 
da70: 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73  to not be a cons
da80: 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tant..**.** The 
da90: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
daa0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
dab0: 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76  ) is used for ev
dac0: 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73  aluating express
dad0: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45  ions.** in a CRE
dae0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
daf0: 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72  ent.  The Walker
db00: 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20  .eCode value is 
db10: 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a  5 when parsing.*
db20: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63  * an existing sc
db30: 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20  hema and 4 when 
db40: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77  processing a new
db50: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62   statement.  A b
db60: 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
db70: 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f  r raises an erro
db80: 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d  r for new statem
db90: 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c  ents, but is sil
dba0: 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a  ently converted.
dbb0: 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65  ** to NULL for e
dbc0: 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e  xisting schemas.
dbd0: 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71    This allows sq
dbe0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
dbf0: 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74  es that .** cont
dc00: 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61  ain a bound para
dc10: 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68  meter because th
dc20: 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65  ey were generate
dc30: 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
dc40: 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
dc50: 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79   to be parsed by
dc60: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
dc70: 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75  of SQLite withou
dc80: 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d  t raising a.** m
dc90: 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20  alformed schema 
dca0: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
dcb0: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
dcc0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
dcd0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
dce0: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
dcf0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69  pWalker->eCode i
dd00: 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 2 then any ter
dd10: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
dd20: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
dd30: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
dd40: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
dd50: 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
dd60: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
dd70: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
dd80: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
dd90: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
dda0: 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65   */.  if( pWalke
ddb0: 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45  r->eCode==2 && E
ddc0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ddd0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
dde0: 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  n) ){.    pWalke
ddf0: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
de00: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
de10: 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rt;.  }..  switc
de20: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
de30: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
de40: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
de50: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
de60: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
de70: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
de80: 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70   ** and either p
de90: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
dea0: 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e   or 5 or the fun
deb0: 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20  ction has the.  
dec0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43    ** SQLITE_FUNC
ded0: 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a  _CONST flag. */.
dee0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
def0: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  TION:.      if( 
df00: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d  pWalker->eCode>=
df10: 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  4 || ExprHasProp
df20: 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f  erty(pExpr,EP_Co
df30: 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  nstFunc) ){.    
df40: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
df50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
df60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57  else{.        pW
df70: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
df80: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
df90: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
dfa0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
dfb0: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
dfc0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
dfd0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
dfe0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
dff0: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
e000: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
e010: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
e020: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e030: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
e040: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
e050: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
e060: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
e070: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e080: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
e090: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
e0a0: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
e0b0: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
e0c0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
e0d0: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
e0e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e0f0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
e100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e110: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
e120: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
e130: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
e140: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73  .      }.    cas
e150: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
e160: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
e170: 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20  ->eCode==5 ){.  
e180: 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c        /* Silentl
e190: 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20  y convert bound 
e1a0: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
e1b0: 61 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66  appear inside of
e1c0: 20 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20   CREATE.        
e1d0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ** statements in
e1e0: 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70  to a NULL when p
e1f0: 61 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54  arsing the CREAT
e200: 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74  E statement text
e210: 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   out.        ** 
e220: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  of the sqlite_ma
e230: 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
e240: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
e250: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  = TK_NULL;.     
e260: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b   }else if( pWalk
e270: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a  er->eCode==4 ){.
e280: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75          /* A bou
e290: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20  nd parameter in 
e2a0: 61 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  a CREATE stateme
e2b0: 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  nt that originat
e2c0: 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20  es from.        
e2d0: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
e2e0: 72 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65  re() causes an e
e2f0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
e300: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
e310: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
e320: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
e330: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
e340: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
e350: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
e360: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
e370: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
e380: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
e390: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
e3a0: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
e3b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
e3c0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
e3d0: 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  S ); /* selectNo
e3e0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
e3f0: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
e400: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
e410: 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73  ontinue;.  }.}.s
e420: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
e430: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
e440: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
e450: 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29  Select *NotUsed)
e460: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
e470: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
e480: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
e490: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
e4a0: 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69  C_Abort;.}.stati
e4b0: 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73  c int exprIsCons
e4c0: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
e4d0: 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75  nitFlag, int iCu
e4e0: 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
e4f0: 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
e500: 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
e510: 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67  eCode = initFlag
e520: 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
e530: 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73  ack = exprNodeIs
e540: 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53  Constant;.  w.xS
e550: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
e560: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
e570: 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72  tant;.  w.u.iCur
e580: 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74   = iCur;.  sqlit
e590: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
e5a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
e5b0: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ode;.}../*.** Wa
e5c0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
e5d0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
e5e0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
e5f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
e600: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
e610: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
e620: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
e630: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
e640: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
e650: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
e660: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
e670: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
e680: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
e690: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
e6a0: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
e6b0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
e6c0: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
e6d0: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
e6e0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
e6f0: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
e700: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
e710: 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29  IsConst(p, 1, 0)
e720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
e730: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
e740: 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
e750: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
e760: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
e770: 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20  nt.** that does 
e780: 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f  no originate fro
e790: 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
e7a0: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
e7b0: 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  oin..** Return 0
e7c0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
e7d0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
e7e0: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74  ction calls or t
e7f0: 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20  erms from.** an 
e800: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
e810: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
e820: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
e830: 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29  NotJoin(Expr *p)
e840: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
e850: 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b  sConst(p, 2, 0);
e860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
e870: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
e880: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
e890: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
e8a0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
e8b0: 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e  t.** for any sin
e8c0: 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74  gle row of the t
e8d0: 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
e8e0: 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72   iCur.  In other
e8f0: 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65   words, the.** e
e900: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e  xpression must n
e910: 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20  ot refer to any 
e920: 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
e930: 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61  c function nor a
e940: 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65  ny.** table othe
e950: 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a  r than iCur..*/.
e960: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
e970: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45  sTableConstant(E
e980: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72  xpr *p, int iCur
e990: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
e9a0: 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43  IsConst(p, 3, iC
e9b0: 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ur);.}../*.** Wa
e9c0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
e9d0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
e9e0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
e9f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
ea00: 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75  stant.** or a fu
ea10: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68  nction call with
ea20: 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
ea30: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64  nts.  Return and
ea40: 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61   0 if there.** a
ea50: 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73  re any variables
ea60: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
ea70: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
ea80: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
ea90: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
eaa0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
eab0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
eac0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
ead0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
eae0: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
eaf0: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
eb00: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
eb10: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
eb20: 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a  rFunction(Expr *
eb30: 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20  p, u8 isInit){. 
eb40: 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d   assert( isInit=
eb50: 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20  =0 || isInit==1 
eb60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  );.  return expr
eb70: 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49  IsConst(p, 4+isI
eb80: 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64  nit, 0);.}..#ifd
eb90: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
eba0: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a  _CURSOR_HINTS./*
ebb0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
ebc0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
ebd0: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
ebe0: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
ebf0: 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  s a.** subquery 
ec00: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52  of some kind.  R
ec10: 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65  eturn 0 if there
ec20: 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69   are no subqueri
ec30: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
ec40: 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75  e3ExprContainsSu
ec50: 62 71 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b  bquery(Expr *p){
ec60: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
ec70: 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
ec80: 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f  eof(w));.  w.eCo
ec90: 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
eca0: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
ecb0: 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
ecc0: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
ecd0: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
ece0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73  eIsConstant;.  s
ecf0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
ed00: 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
ed10: 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65  w.eCode==0;.}.#e
ed20: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
ed30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
ed40: 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  codes a constant
ed50: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73   integer that is
ed60: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a   small enough.**
ed70: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d   to fit in a 32-
ed80: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
ed90: 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68  urn 1 and put th
eda0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
edb0: 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56  nteger.** in *pV
edc0: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78  alue.  If the ex
edd0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
ede0: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66  an integer or if
edf0: 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a   it is too big.*
ee00: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69  * to fit in a si
ee10: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
ee20: 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e  ger, return 0 an
ee30: 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20  d leave *pValue 
ee40: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
ee50: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  t sqlite3ExprIsI
ee60: 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
ee70: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
ee80: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  int rc = 0;..  /
ee90: 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69  * If an expressi
eea0: 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
eeb0: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69   literal that fi
eec0: 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  ts in a signed 3
eed0: 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67  2-bit.  ** integ
eee0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f  er, then the EP_
eef0: 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69  IntValue flag wi
ef00: 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
ef10: 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73  been set */.  as
ef20: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
ef30: 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66  INTEGER || (p->f
ef40: 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
ef50: 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ue)!=0.         
ef60: 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
ef70: 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
ef80: 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20  , &rc)==0 );..  
ef90: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
efa0: 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
efb0: 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75    *pValue = p->u
efc0: 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74  .iValue;.    ret
efd0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69  urn 1;.  }.  swi
efe0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
eff0: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
f000: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
f010: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
f020: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
f030: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
f040: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f050: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
f060: 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
f070: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
f080: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
f090: 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
f0a0: 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28      assert( v!=(
f0b0: 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29  -2147483647-1) )
f0c0: 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  ;.        *pValu
f0d0: 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
f0e0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
f0f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f100: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
f110: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
f120: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f130: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
f140: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
f150: 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70  nce that the exp
f160: 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e  ression can be N
f170: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ULL..**.** If th
f180: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67  e expression mig
f190: 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66  ht be NULL or if
f1a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f1b0: 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a  is too complex.*
f1c0: 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e  * to tell return
f1d0: 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54   TRUE.  .**.** T
f1e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
f1f0: 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69  sed as an optimi
f200: 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20  zation, to skip 
f210: 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65  OP_IsNull opcode
f220: 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f  s.** when we kno
f230: 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63  w that a value c
f240: 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20  annot be NULL.  
f250: 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70  Hence, a false p
f260: 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75  ositive.** (retu
f270: 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20  rning TRUE when 
f280: 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72  in fact the expr
f290: 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72  ession can never
f2a0: 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a   be NULL) might.
f2b0: 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65  ** be a small pe
f2c0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75  rformance hit bu
f2d0: 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68  t is otherwise h
f2e0: 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65  armless.  On the
f2f0: 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20   other.** hand, 
f300: 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  a false negative
f310: 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53   (returning FALS
f320: 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  E when the resul
f330: 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29  t could be NULL)
f340: 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  .** will likely 
f350: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
f360: 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20  orrect answer.  
f370: 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74  So when in doubt
f380: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45  , return.** TRUE
f390: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f3a0: 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f  ExprCanBeNull(co
f3b0: 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  nst Expr *p){.  
f3c0: 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20  u8 op;.  while( 
f3d0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
f3e0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
f3f0: 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
f400: 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
f410: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
f420: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
f430: 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
f440: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
f450: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
f460: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
f470: 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  G:.    case TK_F
f480: 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LOAT:.    case T
f490: 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65  K_BLOB:.      re
f4a0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65  turn 0;.    case
f4b0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
f4c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61    assert( p->pTa
f4d0: 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65  b!=0 );.      re
f4e0: 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
f4f0: 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65  erty(p, EP_CanBe
f500: 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20  Null) ||.       
f510: 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d        (p->iColum
f520: 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d  n>=0 && p->pTab-
f530: 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e  >aCol[p->iColumn
f540: 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20  ].notNull==0);. 
f550: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
f560: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
f570: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f580: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
f590: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
f5a0: 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68  a constant which
f5b0: 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63   would be.** unc
f5c0: 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66  hanged by OP_Aff
f5d0: 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61  inity with the a
f5e0: 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e  ffinity given in
f5f0: 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   the second.** a
f600: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
f610: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
f620: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
f630: 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e   if the OP_Affin
f640: 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  ity operation.**
f650: 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e   can be omitted.
f660: 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20    When in doubt 
f670: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41  return FALSE.  A
f680: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a   false negative.
f690: 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20  ** is harmless. 
f6a0: 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   A false positiv
f6b0: 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20  e, however, can 
f6c0: 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72  result in the wr
f6d0: 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a  ong.** answer..*
f6e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
f6f0: 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
f700: 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70  Change(const Exp
f710: 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b  r *p, char aff){
f720: 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20  .  u8 op;.  if( 
f730: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
f740: 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b  BLOB ) return 1;
f750: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
f760: 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
f770: 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
f780: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
f790: 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
f7a0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
f7b0: 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
f7c0: 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
f7d0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
f7e0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
f7f0: 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
f800: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
f810: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
f820: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
f830: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
f840: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  OAT: {.      ret
f850: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
f860: 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d  AFF_REAL || aff=
f870: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
f880: 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
f890: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
f8a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
f8b0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f==SQLITE_AFF_TE
f8c0: 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  XT;.    }.    ca
f8d0: 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
f8e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
f8f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f900: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
f910: 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c  assert( p->iTabl
f920: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61  e>=0 );  /* p ca
f930: 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20  nnot be part of 
f940: 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  a CHECK constrai
f950: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  nt */.      retu
f960: 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a  rn p->iColumn<0.
f970: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66            && (af
f980: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
f990: 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
f9a0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
f9b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  );.    }.    def
f9c0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65  ault: {.      re
f9d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
f9e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
f9f0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
fa00: 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20  ven string is a 
fa10: 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61  row-id column na
fa20: 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  me..*/.int sqlit
fa30: 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20  e3IsRowid(const 
fa40: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20  char *z){.  if( 
fa50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
fa60: 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20  , "_ROWID_")==0 
fa70: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
fa80: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
fa90: 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20  (z, "ROWID")==0 
faa0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
fab0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
fac0: 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20  (z, "OID")==0 ) 
fad0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
fae0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn 0;.}../*.** p
faf0: 58 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20  X is the RHS of 
fb00: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20  an IN operator. 
fb10: 20 49 66 20 70 58 20 69 73 20 61 20 53 45 4c 45   If pX is a SELE
fb20: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  CT statement .**
fb30: 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d   that can be sim
fb40: 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69 72  plified to a dir
fb50: 65 63 74 20 74 61 62 6c 65 20 61 63 63 65 73 73  ect table access
fb60: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a  , then return.**
fb70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
fb80: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
fb90: 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f  nt.  If pX is no
fba0: 74 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  t a SELECT state
fbb0: 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74  ment,.** or if t
fbc0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
fbd0: 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ent needs to be 
fbe0: 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20  manifested into 
fbf0: 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74  a transient.** t
fc00: 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72  able, then retur
fc10: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64  n NULL..*/.#ifnd
fc20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
fc30: 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 53  UBQUERY.static S
fc40: 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61  elect *isCandida
fc50: 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20  teForInOpt(Expr 
fc60: 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  *pX){.  Select *
fc70: 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  p;.  SrcList *pS
fc80: 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc;.  ExprList *
fc90: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
fca0: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pTab;.  int i;.
fcb0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
fcc0: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
fcd0: 73 53 65 6c 65 63 74 29 20 29 20 72 65 74 75 72  sSelect) ) retur
fce0: 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73  n 0;  /* Not a s
fcf0: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28  ubquery */.  if(
fd00: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
fd10: 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  (pX, EP_VarSelec
fd20: 74 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20  t)  ) return 0; 
fd30: 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73   /* Correlated s
fd40: 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d  ubq */.  p = pX-
fd50: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66  >x.pSelect;.  if
fd60: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65  ( p->pPrior ) re
fd70: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
fd80: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f       /* Not a co
fd90: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
fda0: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
fdb0: 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
fdc0: 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20  t|SF_Aggregate) 
fdd0: 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
fde0: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
fdf0: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
fe00: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
fe10: 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
fe20: 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65  testcase( (p->se
fe30: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
fe40: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
fe50: 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
fe60: 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  te );.    return
fe70: 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e   0; /* No DISTIN
fe80: 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e  CT keyword and n
fe90: 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
fea0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61  tions */.  }.  a
feb0: 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
fec0: 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  By==0 );        
fed0: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
fee0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
fef0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  */.  if( p->pLim
ff00: 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
ff20: 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75  as no LIMIT clau
ff30: 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
ff40: 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ff60: 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73  * No LIMIT means
ff70: 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20   no OFFSET */.  
ff80: 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20  if( p->pWhere ) 
ff90: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
ffa0: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
ffb0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
ffc0: 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
ffd0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
ffe0: 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53  c!=0 );.  if( pS
fff0: 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
10000 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
10010 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20   /* Single term 
10020 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
10030 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b  /.  if( pSrc->a[
10040 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74  0].pSelect ) ret
10050 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52  urn 0;     /* FR
10060 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71  OM is not a subq
10070 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a  uery or view */.
10080 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
10090 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65  [0].pTab;.  asse
100a0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
100b0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
100c0 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20  Select==0 );    
100d0 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
100e0 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
100f0 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73  view */.  if( Is
10100 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
10110 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
10120 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
10130 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
10140 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ble */.  pEList 
10150 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61  = p->pEList;.  a
10160 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
10170 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c   );.  /* All SEL
10180 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74  ECT results must
10190 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a   be columns. */.
101a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
101b0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
101c0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73  {.    Expr *pRes
101d0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
101e0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
101f0 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  Res->op!=TK_COLU
10200 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
10210 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
10220 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61  >iTable==pSrc->a
10230 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20  [0].iCursor );  
10240 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
10250 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
10260 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
10270 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10280 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
10290 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
102a0 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72  an OP_Once instr
102b0 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63  uction and alloc
102c0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ate space for it
102d0 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20 74  s flag. Return t
102e0 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  he .** address o
102f0 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
10300 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
10310 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50 61  lite3CodeOnce(Pa
10320 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
10330 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
10340 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
10350 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  ;      /* Virtua
10360 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
10370 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75 72  coded */.  retur
10380 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
10390 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20  Op1(v, OP_Once, 
103a0 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29  pParse->nOnce++)
103b0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
103c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
103d0 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
103e0 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b   code that check
103f0 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
10400 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
10410 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65  table iCur to se
10420 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61  e if.** it conta
10430 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74  ins any NULL ent
10440 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65  ries.  Cause the
10450 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67   register at reg
10460 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65  HasNull to be se
10470 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  t.** to a non-NU
10480 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72  LL value if iCur
10490 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
104a0 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73  Ls.  Cause regis
104b0 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a  ter regHasNull.*
104c0 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e  * to be set to N
104d0 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74  ULL if iCur cont
104e0 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
104f0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f   NULL values..*/
10500 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
10510 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
10520 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ag(Vdbe *v, int 
10530 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73  iCur, int regHas
10540 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64  Null){.  int add
10550 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r1;.  sqlite3Vdb
10560 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
10570 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73  teger, 0, regHas
10580 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d  Null);.  addr1 =
10590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
105a0 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
105b0 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65   iCur); VdbeCove
105c0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
105d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
105e0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c  OP_Column, iCur,
105f0 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b   0, regHasNull);
10600 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
10610 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
10620 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56  _TYPEOFARG);.  V
10630 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
10640 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25  first_entry_in(%
10650 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73  d)", iCur));.  s
10660 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10670 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a  re(v, addr1);.}.
10680 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66  #endif...#ifndef
10690 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
106a0 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20  QUERY./*.** The 
106b0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49  argument is an I
106c0 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
106d0 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
106e0 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a  bquery) on the .
106f0 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
10700 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
10710 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73   if that list is
10720 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74   constant..*/.st
10730 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
10740 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
10750 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78  Expr *pIn){.  Ex
10760 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20  pr *pLHS;.  int 
10770 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21  res;.  assert( !
10780 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
10790 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  pIn, EP_xIsSelec
107a0 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70  t) );.  pLHS = p
107b0 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e  In->pLeft;.  pIn
107c0 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72  ->pLeft = 0;.  r
107d0 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  es = sqlite3Expr
107e0 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b  IsConstant(pIn);
107f0 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
10800 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72  pLHS;.  return r
10810 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  es;.}.#endif../*
10820 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
10830 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
10840 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
10850 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
10860 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65  operator..** The
10870 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73   pX parameter is
10880 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10890 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
108a0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  e IN operator, w
108b0 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
108c0 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f   either a list o
108d0 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72  f expressions or
108e0 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a   a subquery..**.
108f0 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
10900 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
10910 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
10920 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  a b-tree object 
10930 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75  that can.** be u
10940 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65  sed either to te
10950 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
10960 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74  p in the RHS set
10970 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
10980 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65  hrough.** all me
10990 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53  mbers of the RHS
109a0 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64   set, skipping d
109b0 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  uplicates..**.**
109c0 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65   A cursor is ope
109d0 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65  ned on the b-tre
109e0 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  e object that is
109f0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
10a00 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61  IN operator.** a
10a10 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73  nd pX->iTable is
10a20 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
10a30 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72  x of that cursor
10a40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
10a50 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  rned value of th
10a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
10a70 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65  cates the b-tree
10a80 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77   type, as follow
10a90 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e  s:.**.**   IN_IN
10aa0 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d  DEX_ROWID      -
10ab0 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
10ac0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
10ad0 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  base table..**  
10ae0 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
10af0 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f  ASC  - The curso
10b00 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
10b10 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
10b20 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
10b30 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54  X_INDEX_DESC - T
10b40 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
10b50 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e  ened on a descen
10b60 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
10b70 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20   IN_INDEX_EPH   
10b80 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
10b90 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
10ba0 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
10bb0 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68     populated eph
10be0 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  eremal table..**
10bf0 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50     IN_INDEX_NOOP
10c00 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73         - No curs
10c10 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  or was allocated
10c20 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  .  The IN operat
10c30 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20  or must be.**   
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c50 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65        implemente
10c60 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20  d as a sequence 
10c70 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
10c80 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
10c90 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62  g b-tree might b
10ca0 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48  e used if the RH
10cb0 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20  S expression pX 
10cc0 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73  is a simple.** s
10cd0 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a  ubquery such as:
10ce0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
10cf0 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f  T <column1>, <co
10d00 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c  lumn2>... FROM <
10d10 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20  table>.**.** If 
10d20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
10d30 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
10d40 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63  list or a more c
10d50 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c  omplex subquery,
10d60 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65   then.** an ephe
10d70 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68  meral table migh
10d80 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e  t need to be gen
10d90 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
10da0 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20  RHS and then.** 
10db0 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20  pX->iTable made 
10dc0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
10dd0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
10de0 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a  instead of an.**
10df0 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e   existing table.
10e00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61  .**.** The inFla
10e10 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73  gs parameter mus
10e20 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74 6c  t contain exactl
10e30 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74  y one of the bit
10e40 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  s.** IN_INDEX_ME
10e50 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49  MBERSHIP or IN_I
10e60 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20 69  NDEX_LOOP.  If i
10e70 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a  nFlags contains.
10e80 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  ** IN_INDEX_MEMB
10e90 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65  ERSHIP, then the
10ea0 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
10eb0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
10ec0 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d 62  r a.** fast memb
10ed0 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68  ership test.  Wh
10ee0 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  en the IN_INDEX_
10ef0 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c  LOOP bit is set,
10f00 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65 78   the.** IN index
10f10 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
10f20 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76   loop over all v
10f30 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53  alues of the RHS
10f40 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f 70   of the.** IN op
10f50 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  erator..**.** Wh
10f60 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  en IN_INDEX_LOOP
10f70 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
10f80 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
10f90 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
10fa0 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20  .** through the 
10fb0 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65  set members) the
10fc0 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73  n the b-tree mus
10fd0 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75  t not contain du
10fe0 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20  plicates..** An 
10ff0 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
11000 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c  must be used unl
11010 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
11020 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61   columns are gua
11030 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
11040 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
11050 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
11060 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
11070 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a  Y KEY or due to.
11080 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73  ** a UNIQUE cons
11090 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e  traint or index.
110a0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
110b0 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
110c0 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
110d0 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
110e0 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
110f0 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
11100 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20   tests) then an 
11110 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
11120 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
11130 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73   unless <columns
11140 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e  > is a single IN
11150 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
11160 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a  Y column or an .
11170 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  ** index can be 
11180 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73  found with the s
11190 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e  pecified <column
111a0 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  s> as its left-m
111b0 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ost..**.** If th
111c0 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  e IN_INDEX_NOOP_
111d0 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  OK and IN_INDEX_
111e0 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62  MEMBERSHIP are b
111f0 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69  oth set and.** i
11200 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
11210 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
11220 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
11230 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69  bquery) then thi
11240 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67  s.** routine mig
11250 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63  ht decide that c
11260 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
11270 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20  eral b-tree for 
11280 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65  membership.** te
11290 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70  sting is too exp
112a0 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72  ensive and retur
112b0 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
112c0 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
112d0 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  the.** calling r
112e0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d  outine should im
112f0 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f  plement the IN o
11300 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20  perator using a 
11310 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45  sequence.** of E
11320 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73  q or Ne comparis
11330 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  on operations..*
11340 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d  *.** When the b-
11350 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73  tree is being us
11360 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ed for membershi
11370 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c  p tests, the cal
11380 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
11390 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b   might need to k
113a0 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
113b0 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20  ot the RHS side 
113c0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
113d0 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  or.** contains a
113e0 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73   NULL.  If prRhs
113f0 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61  HasNull is not a
11400 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e   NULL pointer an
11410 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  d .** if there i
11420 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61  s any chance tha
11430 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68  t the (...) migh
11440 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
11450 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
11460 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
11470 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
11480 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
11490 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
114a0 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48  en.** to *prRhsH
114b0 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65  asNull. If there
114c0 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
114d0 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e  at the (...) con
114e0 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
114f0 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52  value, then *prR
11500 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66  hsHasNull is lef
11510 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
11520 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
11530 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
11540 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73  d its location s
11550 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48  tored in *prRhsH
11560 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20  asNull, then.** 
11570 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61  the value in tha
11580 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20  t register will 
11590 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62  be NULL if the b
115a0 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f  -tree contains o
115b0 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55  ne or more.** NU
115c0 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69  LL values, and i
115d0 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e  t will be some n
115e0 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
115f0 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74   the b-tree cont
11600 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20  ains no.** NULL 
11610 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  values..**.** If
11620 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d   the aiMap param
11630 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  eter is not NULL
11640 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  , it must point 
11650 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74  to an array cont
11660 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c  aining.** one el
11670 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63  ement for each c
11680 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62  olumn returned b
11690 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
116a0 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48  tement on the RH
116b0 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e  S.** of the IN(.
116c0 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68  ..) operator. Th
116d0 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20  e i'th entry of 
116e0 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70  the array is pop
116f0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ulated with the.
11700 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  ** offset of the
11710 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
11720 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
11730 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72  'th column retur
11740 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45  ned by the.** SE
11750 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c  LECT. For exampl
11760 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73  e, if the expres
11770 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65  sion and selecte
11780 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a  d index are:.**.
11790 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20  **   (?,?,?) IN 
117a0 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20  (SELECT a, b, c 
117b0 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52  FROM t1).**   CR
117c0 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
117d0 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a   t1(b, c, a);.**
117e0 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d  .** then aiMap[]
117f0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
11800 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f  th {2, 0, 1}..*/
11810 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11820 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
11830 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  t sqlite3FindInI
11840 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
11850 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
11860 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
11870 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
11880 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pX,            
11890 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
118a0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
118b0 53 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  S) of the IN ope
118c0 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69  rator */.  u32 i
118d0 6e 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  nFlags,         
118e0 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45        /* IN_INDE
118f0 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53  X_LOOP, _MEMBERS
11900 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f  HIP, and/or _NOO
11910 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  P_OK */.  int *p
11920 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20  rRhsHasNull,    
11930 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
11940 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74   holding NULL st
11950 61 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73  atus.  See notes
11960 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
11990 20 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f   Index fields to
119a0 20 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29   RHS fields */.)
119b0 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
119e0 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
119f0 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
11a00 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
11a10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
11a30 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
11a40 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
11a50 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
11a60 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
11a70 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
11a80 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
11a90 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
11aa0 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20  eUnique;        
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ac0 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
11ad0 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
11ae0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
11af0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
11b00 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
11b10 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
11b20 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
11b30 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
11b40 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71   );.  mustBeUniq
11b50 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20  ue = (inFlags & 
11b60 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d  IN_INDEX_LOOP)!=
11b70 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
11b80 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e  RHS of this IN(.
11b90 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ..) operator is 
11ba0 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66  a SELECT, and if
11bb0 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a   it matters .  *
11bc0 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
11bd0 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75   the SELECT resu
11be0 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  lt contains NULL
11bf0 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77   values, check w
11c00 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
11c10 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61  ot NULL is actua
11c20 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74  lly possible (it
11c30 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72   may not be, for
11c40 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20   example, due . 
11c50 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20   ** to NOT NULL 
11c60 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
11c70 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e  he schema). If n
11c80 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
11c90 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a  e possible,.  **
11ca0 20 73 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c   set prRhsHasNul
11cb0 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f  l to 0 before co
11cc0 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20  ntinuing.  */.  
11cd0 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
11ce0 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20 26   && (pX->flags &
11cf0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
11d00 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
11d10 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
11d20 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  t = pX->x.pSelec
11d30 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66  t->pEList;.    f
11d40 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
11d50 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
11d60 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
11d70 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45  ExprCanBeNull(pE
11d80 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
11d90 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
11da0 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69  .    if( i==pELi
11db0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
11dc0 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20     prRhsHasNull 
11dd0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
11de0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
11df0 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
11e00 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
11e10 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
11e20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
11e30 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
11e40 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
11e50 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
11e60 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
11e70 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  able.  */.  if( 
11e80 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
11e90 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64  && (p = isCandid
11ea0 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29  ateForInOpt(pX))
11eb0 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
11ec0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11ed0 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
11ee0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
11ef0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nnection */.    
11f00 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
11f30 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
11f40 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20  i16 iDb;        
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
11f70 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20  se idx for pTab 
11f80 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
11f90 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  *pEList = p->pEL
11fa0 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78  ist;.    int nEx
11fb0 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
11fc0 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  pr;..    assert(
11fd0 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ff0 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
12000 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
12010 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
12020 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
12030 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20  .pExpr!=0 ); /* 
12040 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
12050 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
12060 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
12070 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20   p->pSrc!=0 );  
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12090 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
120a0 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
120b0 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  ) */.    pTab = 
120c0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
120d0 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65  ab;..    /* Code
120e0 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69   an OP_Transacti
120f0 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c  on and OP_TableL
12100 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e  ock for <table>.
12110 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
12120 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
12130 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
12140 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  hema);.    sqlit
12150 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
12160 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
12170 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
12180 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
12190 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
121a0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
121b0 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 20  .    assert(v); 
121c0 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64   /* sqlite3GetVd
121d0 62 65 28 29 20 68 61 73 20 61 6c 77 61 79 73 20  be() has always 
121e0 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
121f0 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66  called */.    if
12200 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45  ( nExpr==1 && pE
12210 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
12220 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
12230 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20 49       /* The "x I
12240 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20  N (SELECT rowid 
12250 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61 73  FROM table)" cas
12260 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  e */.      int i
12270 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
12280 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
12290 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
122a0 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71  ge(v);..      sq
122b0 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
122c0 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
122d0 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
122e0 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70  ead);.      eTyp
122f0 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
12300 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ID;..      sqlit
12310 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12320 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65  , iAddr);.    }e
12330 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
12340 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
12370 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
12380 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
12390 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  1;.      int i;.
123a0 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
123b0 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
123c0 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
123d0 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65  sed to perform e
123e0 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ach .      ** co
123f0 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20  mparison is the 
12400 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69  same as the affi
12410 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c  nity of each col
12420 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20  umn in table.   
12430 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53     ** on the RHS
12440 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
12450 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c  tor.  If it not,
12460 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
12470 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
12480 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66  use any index of
12490 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20   the RHS table. 
124a0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
124b0 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66  0; i<nExpr && af
124c0 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b  finity_ok; i++){
124d0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
124e0 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63  Lhs = sqlite3Vec
124f0 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
12500 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pX->pLeft, i);. 
12510 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
12520 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
12530 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
12540 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61         char idxa
12550 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c  ff = sqlite3Tabl
12560 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  eColumnAffinity(
12570 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52  pTab,iCol); /* R
12580 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  HS table */.    
12590 20 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20      char cmpaff 
125a0 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
125b0 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69  Affinity(pLhs, i
125c0 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  dxaff);.        
125d0 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66  testcase( cmpaff
125e0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
125f0 42 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  B );.        tes
12600 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53  tcase( cmpaff==S
12610 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
12620 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  ;.        switch
12630 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20  ( cmpaff ){.    
12640 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
12650 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20  E_AFF_BLOB:.    
12660 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12670 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
12680 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20  LITE_AFF_TEXT:. 
12690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
126a0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
126b0 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75  nity() only retu
126c0 72 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20  rns TEXT if one 
126d0 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20  side or the.    
126e0 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
126f0 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79   has no affinity
12700 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73   and the other s
12710 69 64 65 20 69 73 20 54 45 58 54 2e 20 20 48 65  ide is TEXT.  He
12720 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nce,.           
12730 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   ** the only way
12740 20 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62   for cmpaff to b
12750 65 20 54 45 58 54 20 69 73 20 66 6f 72 20 69 64  e TEXT is for id
12760 78 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a  xaff to be TEXT.
12770 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
12780 6e 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20  nd for the term 
12790 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
127a0 65 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20  e IN to have no 
127b0 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
127c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
127d0 20 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f   idxaff==SQLITE_
127e0 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
127f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12800 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
12810 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66  :.            af
12820 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69  finity_ok = sqli
12830 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
12840 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20  nity(idxaff);.  
12850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12860 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 69 6e  .      if( affin
12870 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20  ity_ok ){.      
12880 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
12890 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65  an existing inde
128a0 78 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b  x that will work
128b0 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65   for this IN ope
128c0 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
128d0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
128e0 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20  pIndex; pIdx && 
128f0 65 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70  eType==0; pIdx=p
12900 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
12910 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63         Bitmask c
12920 6f 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20  olUsed;      /* 
12930 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  Columns of the i
12940 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20 20  ndex used */.   
12950 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
12960 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Col;         /* 
12970 4d 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75 72  Mask for the cur
12980 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  rent column */. 
12990 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
129a0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72  x->nColumn<nExpr
129b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
129c0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
129d0 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53  m nColumn is BMS
129e0 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73  -2, not BMS-1, s
129f0 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 6f  o that we can co
12a00 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20 20 20  mpute.          
12a10 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70 72  ** BITMASK(nExpr
12a20 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66 6c  ) without overfl
12a30 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  owing */.       
12a40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64     testcase( pId
12a50 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d  x->nColumn==BMS-
12a60 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  2 );.          t
12a70 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e  estcase( pIdx->n
12a80 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b  Column==BMS-1 );
12a90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
12aa0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d  Idx->nColumn>=BM
12ab0 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  S-1 ) continue;.
12ac0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 75            if( mu
12ad0 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20 20  stBeUnique ){.  
12ae0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
12af0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70  dx->nKeyCol>nExp
12b00 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  r.             |
12b10 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  |(pIdx->nColumn>
12b20 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e 69 71  nExpr && !IsUniq
12b30 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a 20  ueIndex(pIdx)). 
12b40 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
12b50 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
12b60 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 69  inue;  /* This i
12b70 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69 71  ndex is not uniq
12b80 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20 52  ue over the IN R
12b90 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  HS columns */.  
12ba0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12bb0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
12bc0 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20 30       colUsed = 0
12bd0 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f  ;   /* Columns o
12be0 66 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f 20  f index used so 
12bf0 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  far */.         
12c00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
12c10 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
12c20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
12c30 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
12c40 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
12c50 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
12c60 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 68         Expr *pRh
12c70 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s = pEList->a[i]
12c80 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
12c90 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65      CollSeq *pRe
12ca0 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  q = sqlite3Binar
12cb0 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
12cc0 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52  pParse, pLhs, pR
12cd0 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  hs);.           
12ce0 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20   int j;.  .     
12cf0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12d00 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e  Req!=0 || pRhs->
12d10 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49  iColumn==XN_ROWI
12d20 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  D || pParse->nEr
12d30 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
12d40 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70   for(j=0; j<nExp
12d50 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
12d60 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
12d70 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52  >aiColumn[j]!=pR
12d80 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  hs->iColumn ) co
12d90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
12db0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b  dx->azColl[j] );
12dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
12dd0 66 28 20 70 52 65 71 21 3d 30 20 26 26 20 73 71  f( pReq!=0 && sq
12de0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65  lite3StrICmp(pRe
12df0 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e  q->zName, pIdx->
12e00 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b  azColl[j])!=0 ){
12e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12e20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12e30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12e40 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
12e50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
12e60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
12e70 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a  =nExpr ) break;.
12e80 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c              mCol
12e90 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20   = MASKBIT(j);. 
12ea0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d             if( m
12eb0 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29 20  Col & colUsed ) 
12ec0 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63  break; /* Each c
12ed0 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20  olumn used only 
12ee0 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  once */.        
12ef0 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d      colUsed |= m
12f00 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
12f10 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d   if( aiMap ) aiM
12f20 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20  ap[i] = j;.     
12f30 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
12f40 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
12f50 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21  Expr || colUsed!
12f60 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29  =(MASKBIT(nExpr)
12f70 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  -1) );.         
12f80 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d   if( colUsed==(M
12f90 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
12fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12fb0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
12fc0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
12fd0 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78 20  means the index 
12fe0 70 49 64 78 20 69 73 20 75 73 61 62 6c 65 20 2a  pIdx is usable *
12ff0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
13000 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
13010 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
13020 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
13030 76 29 3b 0a 20 20 23 69 66 6e 64 65 66 20 53 51  v);.  #ifndef SQ
13040 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
13050 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  N.            sq
13060 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13070 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30  v, OP_Explain, 0
13080 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
13090 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
130a0 69 6e 74 66 28 64 62 2c 20 22 55 53 49 4e 47 20  intf(db, "USING 
130b0 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d  INDEX %s FOR IN-
130c0 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e  OPERATOR",pIdx->
130d0 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
130e0 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43        P4_DYNAMIC
130f0 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20  );.  #endif.    
13100 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13110 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13120 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20  OpenRead, iTab, 
13130 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
13140 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
13150 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
13160 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
13170 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  dx);.           
13180 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13190 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
131a0 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
131b0 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44    assert( IN_IND
131c0 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d  EX_INDEX_DESC ==
131d0 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
131e0 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ASC+1 );.       
131f0 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
13200 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
13210 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  + pIdx->aSortOrd
13220 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20  er[0];.  .      
13230 20 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48        if( prRhsH
13240 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  asNull ){.      
13250 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61          *prRhsHa
13260 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  sNull = ++pParse
13270 2d 3e 6e 4d 65 6d 3b 0a 20 20 23 69 66 64 65 66  ->nMem;.  #ifdef
13280 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
13290 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a  OLUMN_USED_MASK.
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 36                i6
132b0 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78  4 mask = (1<<nEx
132c0 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  pr)-1;.         
132d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
132e0 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
132f0 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20  _ColumnsUsed, . 
13300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13310 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28 75 38   iTab, 0, 0, (u8
13320 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36  *)&mask, P4_INT6
13330 34 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20  4);.  #endif.   
13340 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
13350 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20  Expr==1 ){.     
13360 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13370 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67  e3SetHasNullFlag
13380 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73  (v, iTab, *prRhs
13390 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  HasNull);.      
133a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
133b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
133c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
133d0 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
133e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
133f0 20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20         } /* End 
13400 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65  loop over indexe
13410 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20  s */.      } /* 
13420 45 6e 64 20 69 66 28 20 61 66 66 69 6e 69 74 79  End if( affinity
13430 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f  _ok ) */.    } /
13440 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20  * End if not an 
13450 72 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20  rowid index */. 
13460 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70   } /* End attemp
13470 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73  t to optimize us
13480 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a  ing an index */.
13490 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65  .  /* If no pree
134a0 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73  xisting index is
134b0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74   available for t
134c0 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a  he IN clause.  *
134d0 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e  * and IN_INDEX_N
134e0 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65  OOP is an allowe
134f0 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64  d reply.  ** and
13500 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
13510 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
13520 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62   list, not a sub
13530 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74  query.  ** and t
13540 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f  he RHS is not co
13550 6e 73 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77  nstant or has tw
13560 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73  o or fewer terms
13570 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69  ,.  ** then it i
13580 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61  s not worth crea
13590 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ting an ephemera
135a0 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75  l table to evalu
135b0 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20  ate.  ** the IN 
135c0 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75  operator so retu
135d0 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  rn IN_INDEX_NOOP
135e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
135f0 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46  pe==0.   && (inF
13600 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
13610 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21  NOOP_OK).   && !
13620 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13630 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
13640 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74 65  ).   && (!sqlite
13650 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74  3InRhsIsConstant
13660 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c  (pX) || pX->x.pL
13670 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20  ist->nExpr<=2). 
13680 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20   ){.    eType = 
13690 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20  IN_INDEX_NOOP;. 
136a0 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
136b0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  =0 ){.    /* Cou
136c0 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65  ld not find an e
136d0 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
136e0 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73   index to use as
136f0 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e   the RHS b-tree.
13700 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20  .    ** We will 
13710 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65  have to generate
13720 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
13730 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f  ble to do the jo
13740 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33  b..    */.    u3
13750 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  2 savedNQueryLoo
13760 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
13770 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  ryLoop;.    int 
13780 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
13790 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
137a0 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20  _INDEX_EPH;.    
137b0 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e  if( inFlags & IN
137c0 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20  _INDEX_LOOP ){. 
137d0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75       pParse->nQu
137e0 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20  eryLoop = 0;.   
137f0 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74     if( pX->pLeft
13800 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21  ->iColumn<0 && !
13810 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13820 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
13830 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79  ) ){.        eTy
13840 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
13850 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WID;.      }.   
13860 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68 73   }else if( prRhs
13870 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  HasNull ){.     
13880 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d   *prRhsHasNull =
13890 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
138a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
138b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
138c0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
138d0 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48  Parse, pX, rMayH
138e0 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d  aveNull, eType==
138f0 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b  IN_INDEX_ROWID);
13900 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
13910 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e  eryLoop = savedN
13920 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c  QueryLoop;.  }el
13930 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62  se{.    pX->iTab
13940 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a  le = iTab;.  }..
13950 20 20 69 66 28 20 61 69 4d 61 70 20 26 26 20 65    if( aiMap && e
13960 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type!=IN_INDEX_I
13970 4e 44 45 58 5f 41 53 43 20 26 26 20 65 54 79 70  NDEX_ASC && eTyp
13980 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e!=IN_INDEX_INDE
13990 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e  X_DESC ){.    in
139a0 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20  t i, n;.    n = 
139b0 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
139c0 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29  rSize(pX->pLeft)
139d0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
139e0 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69  <n; i++) aiMap[i
139f0 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  ] = i;.  }.  ret
13a00 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e  urn eType;.}.#en
13a10 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
13a20 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
13a30 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  Y./*.** Argument
13a40 20 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c   pExpr is an (?,
13a50 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65   ?...) IN(...) e
13a60 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20  xpression. This 
13a70 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
13a80 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
13a90 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  ns a nul-termina
13aa0 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
13ab0 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66  ining .** the af
13ac0 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75  finities to be u
13ad0 73 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  sed for each col
13ae0 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  umn of the compa
13af0 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  rison..**.** It 
13b00 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
13b10 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
13b20 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ler to ensure th
13b30 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  at the returned.
13b40 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76 65  ** string is eve
13b50 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
13b60 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
13b70 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  e()..*/.static c
13b80 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e  har *exprINAffin
13b90 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
13ba0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
13bb0 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d  .  Expr *pLeft =
13bc0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
13bd0 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
13be0 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
13bf0 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65  e(pLeft);.  Sele
13c00 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70  ct *pSelect = (p
13c10 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
13c20 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45  _xIsSelect) ? pE
13c30 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a  xpr->x.pSelect :
13c40 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74   0;.  char *zRet
13c50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ;..  assert( pEx
13c60 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
13c70 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65  .  zRet = sqlite
13c80 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
13c90 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31  arse->db, nVal+1
13ca0 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  );.  if( zRet ){
13cb0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
13cc0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b  for(i=0; i<nVal;
13cd0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
13ce0 72 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56  r *pA = sqlite3V
13cf0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
13d00 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
13d10 20 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69     char a = sqli
13d20 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
13d30 70 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pA);.      if( p
13d40 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
13d50 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69    zRet[i] = sqli
13d60 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
13d70 74 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  ty(pSelect->pELi
13d80 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
13d90 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  a);.      }else{
13da0 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d  .        zRet[i]
13db0 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = a;.      }.  
13dc0 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61    }.    zRet[nVa
13dd0 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  l] = '\0';.  }. 
13de0 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
13df0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
13e00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
13e10 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  UERY./*.** Load 
13e20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
13e30 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
13e40 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69  irst argument wi
13e50 74 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  th an error .** 
13e60 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66  message of the f
13e70 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75  orm:.**.**   "su
13e80 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
13e90 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70   N columns - exp
13ea0 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76  ected M".*/   .v
13eb0 6f 69 64 20 73 71 6c 69 74 65 33 53 75 62 73 65  oid sqlite3Subse
13ec0 6c 65 63 74 45 72 72 6f 72 28 50 61 72 73 65 20  lectError(Parse 
13ed0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63  *pParse, int nAc
13ee0 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63  tual, int nExpec
13ef0 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
13f00 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65   *zFmt = "sub-se
13f10 6c 65 63 74 20 72 65 74 75 72 6e 73 20 25 64 20  lect returns %d 
13f20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
13f30 65 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65  ed %d";.  sqlite
13f40 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13f50 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c  , zFmt, nActual,
13f60 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e   nExpect);.}.#en
13f70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
13f80 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61  ate code for sca
13f90 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75  lar subqueries u
13fa0 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72  sed as a subquer
13fb0 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58  y expression, EX
13fc0 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f  ISTS,.** or IN o
13fd0 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70  perators.  Examp
13fe0 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  les:.**.**     (
13ff0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
14000 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62            -- sub
14010 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49  query.**     EXI
14020 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52  STS (SELECT a FR
14030 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54  OM b)   -- EXIST
14040 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  S subquery.**   
14050 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20    x IN (4,5,11) 
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
14070 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
14080 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68   list on right-h
14090 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20  and side.**     
140a0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46  x IN (SELECT a F
140b0 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e  ROM b)     -- IN
140c0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73   operator with s
140d0 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72  ubquery on the r
140e0 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ight.**.** The p
140f0 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64  Expr parameter d
14100 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70  escribes the exp
14110 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
14120 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20  tains the IN.** 
14130 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71  operator or subq
14140 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  uery..**.** If p
14150 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64  arameter isRowid
14160 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
14170 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  en expression pE
14180 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  xpr is guarantee
14190 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68  d.** to be of th
141a0 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20  e form "<rowid> 
141b0 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77  IN (?, ?, ?)", w
141c0 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20  here <rowid> is 
141d0 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74  a reference.** t
141e0 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b  o some integer k
141f0 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  ey column of a t
14200 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20  able B-Tree. In 
14210 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61  this case, use a
14220 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72  n.** intkey B-Tr
14230 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ee to store the 
14240 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76  set of IN(...) v
14250 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66  alues instead of
14260 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73   the usual.** (s
14270 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20  lower) variable 
14280 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72  length keys B-Tr
14290 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
142a0 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e  yHaveNull is non
142b0 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e  -zero, that mean
142c0 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61  s that the opera
142d0 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a  tion is an IN.**
142e0 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f   (not a SELECT o
142f0 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68  r EXISTS) and th
14300 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74  at the RHS might
14310 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e   contains NULLs.
14320 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  .** All this rou
14330 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69  tine does is ini
14340 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69  tialize the regi
14350 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d  ster given by rM
14360 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f  ayHaveNull.** to
14370 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20   NULL.  Calling 
14380 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61  routines will ta
14390 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67  ke care of chang
143a0 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65  ing this registe
143b0 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f  r.** value to no
143c0 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48  n-NULL if the RH
143d0 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a  S is NULL-free..
143e0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45  **.** For a SELE
143f0 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  CT or EXISTS ope
14400 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68  rator, return th
14410 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  e register that 
14420 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73  holds the.** res
14430 75 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74  ult.  For a mult
14440 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c  i-column SELECT,
14450 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
14460 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69  tored in a conti
14470 67 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f  guous.** array o
14480 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  f registers and 
14490 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
144a0 20 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72   is the register
144b0 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   of the left-mos
144c0 74 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75  t.** result colu
144d0 6d 6e 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f  mn.  Return 0 fo
144e0 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f  r IN operators o
144f0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
14500 63 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  curs..*/.#ifndef
14510 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
14520 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
14530 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a  3CodeSubselect(.
14540 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
14560 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
14570 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
14580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14590 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20   IN, SELECT, or 
145a0 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20  EXISTS operator 
145b0 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c  */.  int rHasNul
145c0 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20  lFlag,       /* 
145d0 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65  Register that re
145e0 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55  cords whether NU
145f0 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53  LLs exist in RHS
14600 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69   */.  int isRowi
14610 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d             /*
14620 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66   If true, LHS of
14630 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
14640 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  a rowid */.){.  
14650 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  int jmpIfDynamic
14660 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
14670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14680 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
14690 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52  ress */.  int rR
146a0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
146b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146c0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74    /* Register st
146d0 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20  oring resulting 
146e0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
146f0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
14700 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56  arse);.  if( NEV
14710 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
14720 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  n 0;.  sqlite3Ex
14730 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
14740 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65  se);..  /* The e
14750 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  valuation of the
14760 20 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43   IN/EXISTS/SELEC
14770 54 20 6d 75 73 74 20 62 65 20 72 65 70 65 61 74  T must be repeat
14780 65 64 20 65 76 65 72 79 20 74 69 6d 65 20 69 74  ed every time it
14790 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74  .  ** is encount
147a0 65 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74  ered if any of t
147b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
147c0 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
147d0 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
147e0 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63  hand side is a c
147f0 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
14800 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  ry.  **    *  Th
14810 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
14820 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69  e is an expressi
14830 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  on list containi
14840 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  ng variables.  *
14850 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69  *    *  We are i
14860 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a  nside a trigger.
14870 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c    **.  ** If all
14880 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72   of the above ar
14890 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65  e false, then we
148a0 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f   can run this co
148b0 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a  de just once.  *
148c0 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c  * save the resul
148d0 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68  ts, and reuse th
148e0 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e  e same result on
148f0 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f   subsequent invo
14900 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  cations..  */.  
14910 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
14920 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
14930 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  arSelect) ){.   
14940 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
14950 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
14960 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76  pParse); VdbeCov
14970 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23  erage(v);.  }..#
14980 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14990 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28  IT_EXPLAIN.  if(
149a0 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
149b0 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==2 ){.    char 
149c0 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
149d0 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
149e0 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25 73  b, "EXECUTE %s%s
149f0 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20   SUBQUERY %d",. 
14a00 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
14a10 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45  mic>=0?"":"CORRE
14a20 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20  LATED ",.       
14a30 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
14a40 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52  N?"LIST":"SCALAR
14a50 22 2c 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ",.        pPars
14a60 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14a70 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
14a80 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14a90 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
14aa0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
14ab0 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
14ac0 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e  YNAMIC);.  }.#en
14ad0 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70  dif..  switch( p
14ae0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
14af0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
14b00 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
14b30 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
14b40 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
14b50 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
14b60 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20  = pExpr->pLeft; 
14b70 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  /* the LHS of th
14b80 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
14b90 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
14ba0 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
14bb0 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d     /* Key inform
14bc0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
14bd0 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20  nt nVal;        
14be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
14bf0 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65  ze of vector pLe
14c00 66 74 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20  ft */.      .   
14c10 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65     nVal = sqlite
14c20 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
14c30 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73  pLeft);.      as
14c40 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c  sert( !isRowid |
14c50 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20  | nVal==1 );..  
14c60 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74      /* Whether t
14c70 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28  his is an 'x IN(
14c80 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61  SELECT...)' or a
14c90 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73  n 'x IN(<exprlis
14ca0 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78  t>)'.      ** ex
14cb0 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68  pression it is h
14cc0 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20  andled the same 
14cd0 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72  way.  An ephemer
14ce0 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20  al table is .   
14cf0 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74     ** filled wit
14d00 68 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  h index keys rep
14d10 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
14d20 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 0a  sults from the .
14d30 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20        ** SELECT 
14d40 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
14d50 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
14d60 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
14d70 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
14d80 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
14d90 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
14da0 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
14db0 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
14dc0 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
14dd0 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
14de0 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
14df0 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
14e00 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
14e10 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
14e20 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
14e30 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
14e40 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
14e50 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
14e60 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
14e70 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
14e80 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
14e90 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
14ea0 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
14eb0 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
14ec0 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
14ed0 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
14ee0 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
14ef0 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
14f00 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
14f10 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
14f20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
14f30 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
14f40 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
14f50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f60 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14f70 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20  emeral, .       
14f80 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
14f90 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61  , (isRowid?0:nVa
14fa0 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  l));.      pKeyI
14fb0 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20  nfo = isRowid ? 
14fc0 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 : sqlite3KeyIn
14fd0 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
14fe0 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20  db, nVal, 1);.. 
14ff0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
15000 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
15010 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
15020 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
15030 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
15040 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
15050 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
15060 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
15070 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
15080 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
15090 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
150a0 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
150b0 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
150c0 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
150d0 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
150e0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
150f0 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e  Select = pExpr->
15100 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
15110 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
15120 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
15130 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20  EList;..        
15140 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
15150 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   );.        /* I
15160 66 20 74 68 65 20 4c 48 53 20 61 6e 64 20 52 48  f the LHS and RH
15170 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
15180 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ator do not matc
15190 68 2c 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  h, that.        
151a0 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20 68 61  ** error will ha
151b0 76 65 20 62 65 65 6e 20 63 61 75 67 68 74 20 6c  ve been caught l
151c0 6f 6e 67 20 62 65 66 6f 72 65 20 77 65 20 72 65  ong before we re
151d0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20  ach this point. 
151e0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 41  */.        if( A
151f0 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45  LWAYS(pEList->nE
15200 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20  xpr==nVal) ){.  
15210 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
15220 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
15230 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
15240 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
15250 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
15260 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d   SRT_Set, pExpr-
15270 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
15280 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73      dest.zAffSds
15290 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69  t = exprINAffini
152a0 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ty(pParse, pExpr
152b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
152c0 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61  ert( (pExpr->iTa
152d0 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d  ble&0x0000FFFF)=
152e0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
152f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c  ;.          pSel
15300 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  ect->iLimit = 0;
15310 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
15320 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65  ase( pSelect->se
15330 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
15340 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20  inct );.        
15350 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65 79    testcase( pKey
15360 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61  Info==0 ); /* Ca
15370 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73  used by OOM in s
15380 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
15390 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oc() */.        
153a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
153b0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
153c0 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  ect, &dest) ){. 
153d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
153e0 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
153f0 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64  >db, dest.zAffSd
15400 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st);.           
15410 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
15420 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
15430 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
15440 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 0;.          
15450 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
15460 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
15470 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53  ->db, dest.zAffS
15480 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dst);.          
15490 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
154a0 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69  !=0 ); /* OOM wi
154b0 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20 61 66  ll cause exit af
154c0 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ter sqlite3Selec
154d0 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  t() */.         
154e0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
154f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
15500 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e  assert( pEList->
15510 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20  nExpr>0 );.     
15520 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
15530 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
15540 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29  teable(pKeyInfo)
15550 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   );.          fo
15560 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69  r(i=0; i<nVal; i
15570 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
15580 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
15590 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
155a0 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
155b0 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79              pKey
155c0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
155d0 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
155e0 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20  mpareCollSeq(.  
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
15600 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d  arse, p, pEList-
15610 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20 20  >a[i].pExpr.    
15620 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
15630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15640 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
15650 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
15660 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  .pList!=0) ){.  
15670 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
15680 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
15690 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
156a0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f  **.        ** Fo
156b0 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
156c0 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65  n, build an inde
156d0 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65  x key from the e
156e0 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20  valuation and.  
156f0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69        ** store i
15700 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  t in the tempora
15710 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78  ry table. If <ex
15720 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  pr> is a column,
15730 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20   then use.      
15740 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e    ** that column
15750 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20  s affinity when 
15760 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b  building index k
15770 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  eys. If <expr> i
15780 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
15790 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e   a column, use n
157a0 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e  umeric affinity.
157b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
157c0 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
157d0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  y;            /*
157e0 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   Affinity of the
157f0 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a   LHS of the IN *
15800 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
15810 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
15820 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
15830 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
15840 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
15850 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
15860 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20          int r1, 
15870 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20  r2, r3;..       
15880 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69   affinity = sqli
15890 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
158a0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
158b0 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
158c0 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e  .          affin
158d0 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
158e0 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d  _BLOB;.        }
158f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
15900 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
15910 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
15920 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
15930 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
15940 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  ;.          pKey
15950 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d  Info->aColl[0] =
15960 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
15970 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
15980 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
15990 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
159a0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
159b0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
159c0 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a   <exprlist>. */.
159d0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
159e0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
159f0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
15a00 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
15a10 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
15a20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
15a30 77 69 64 20 29 20 73 71 6c 69 74 65 33 56 64 62  wid ) sqlite3Vdb
15a40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
15a50 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20  ll, 0, r2);.    
15a60 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d      for(i=pList-
15a70 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c  >nExpr, pItem=pL
15a80 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  ist->a; i>0; i--
15a90 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
15aa0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20        Expr *pE2 
15ab0 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
15ac0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 56            int iV
15ad0 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20  alToIns;..      
15ae0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78      /* If the ex
15af0 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
15b00 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65  constant then we
15b10 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20   will need to.  
15b20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62          ** disab
15b30 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61 74  le the test that
15b40 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 61   was generated a
15b50 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20  bove that makes 
15b60 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a  sure.          *
15b70 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79  * this code only
15b80 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20   executes once. 
15b90 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e   Because for a n
15ba0 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  on-constant.    
15bb0 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
15bc0 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72  ion we need to r
15bd0 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65  erun this code e
15be0 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ach time..      
15bf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
15c00 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69   if( jmpIfDynami
15c10 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  c>=0 && !sqlite3
15c20 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
15c30 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
15c40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
15c50 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d  angeToNoop(v, jm
15c60 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20  pIfDynamic);.   
15c70 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79           jmpIfDy
15c80 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20  namic = -1;.    
15c90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
15ca0 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
15cb0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
15cc0 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
15cd0 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
15ce0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
15cf0 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69   isRowid && sqli
15d00 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
15d10 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73  (pE2, &iValToIns
15d20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
15d30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15d40 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49  p3(v, OP_InsertI
15d50 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nt, pExpr->iTabl
15d60 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73  e, r2, iValToIns
15d70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
15d80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
15d90 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r3 = sqlite3Expr
15da0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
15db0 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20  e, pE2, r1);.   
15dc0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
15dd0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
15de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15df0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
15e00 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20  stBeInt, r3,.   
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15e30 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
15e40 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
15e50 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
15e60 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
15e70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15e80 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15e90 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
15ea0 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a  Table, r2, r3);.
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
15ec0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
15ed0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15ee0 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
15ef0 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20  ord, r3, 1, r2, 
15f00 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  &affinity, 1);. 
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15f20 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
15f30 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
15f40 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20  se, r3, 1);.    
15f50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15f60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15f70 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78  P_IdxInsert, pEx
15f80 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b  pr->iTable, r2);
15f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
15fa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15fb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
15fc0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
15fd0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
15fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
15ff0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16000 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
16010 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65   }.      if( pKe
16020 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
16030 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16040 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76  geP4(v, addr, (v
16050 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  oid *)pKeyInfo, 
16060 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
16070 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
16080 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
16090 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
160a0 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
160b0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
160c0 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a        /* Case 3:
160d0 20 20 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20      (SELECT ... 
160e0 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20  FROM ...).      
160f0 2a 2a 20 20 20 20 20 6f 72 3a 20 20 20 20 45 58  **     or:    EX
16100 49 53 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ISTS(SELECT ... 
16110 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20  FROM ...).      
16120 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
16130 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61  a SELECT, genera
16140 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
16150 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c  he values for al
16160 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20  l columns of.   
16170 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
16180 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  row into an arra
16190 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61  y of registers a
161a0 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e  nd return the in
161b0 64 65 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  dex of.      ** 
161c0 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
161d0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
161e0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
161f0 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74   an EXISTS, writ
16200 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28  e an integer 0 (
16210 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31  not exists) or 1
16220 20 28 65 78 69 73 74 73 29 0a 20 20 20 20 20 20   (exists).      
16230 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
16240 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  er and return th
16250 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  at register numb
16260 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
16270 20 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61     ** In both ca
16280 73 65 73 2c 20 74 68 65 20 71 75 65 72 79 20 69  ses, the query i
16290 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
162a0 20 22 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79   "LIMIT 1".  Any
162b0 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 65 78   .      ** preex
162c0 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20  isting limit is 
162d0 64 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61  discarded in pla
162e0 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49  ce of the new LI
162f0 4d 49 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f 0a  MIT 1..      */.
16300 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
16310 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
16320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
16330 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
16340 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20  to encode */.   
16350 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
16360 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
16370 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
16380 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c  to deal with SEL
16390 45 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ECT result */.  
163a0 20 20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20      int nReg;   
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
163d0 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
163e0 74 65 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73  te */..      tes
163f0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
16400 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
16410 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
16420 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
16430 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ECT );.      ass
16440 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
16450 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78  TK_EXISTS || pEx
16460 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
16470 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
16480 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
16490 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
164a0 53 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20 20  Select) );..    
164b0 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e    pSel = pExpr->
164c0 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
164d0 20 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f   nReg = pExpr->o
164e0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70  p==TK_SELECT ? p
164f0 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sel->pEList->nEx
16500 70 72 20 3a 20 31 3b 0a 20 20 20 20 20 20 73 71  pr : 1;.      sq
16510 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
16520 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50  nit(&dest, 0, pP
16530 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20  arse->nMem+1);. 
16540 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
16550 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20  m += nReg;.     
16560 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
16570 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
16580 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
16590 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
165a0 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20     dest.iSdst = 
165b0 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
165c0 20 20 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74        dest.nSdst
165d0 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 20   = nReg;.       
165e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
165f0 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
16600 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20  , dest.iSDParm, 
16610 64 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65  dest.iSDParm+nRe
16620 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  g-1);.        Vd
16630 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
16640 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73  nit subquery res
16650 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65  ult"));.      }e
16660 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73  lse{.        des
16670 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78  t.eDest = SRT_Ex
16680 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71  ists;.        sq
16690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
166a0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
166b0 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b  , dest.iSDParm);
166c0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
166d0 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45  ment((v, "Init E
166e0 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b  XISTS result"));
166f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16700 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
16710 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
16720 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  l->pLimit);.    
16730 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
16740 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
16750 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52  arse, TK_INTEGER
16760 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
16770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16780 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69 74            &sqlit
16790 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b  e3IntTokens[1]);
167a0 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69  .      pSel->iLi
167b0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
167c0 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d  Sel->selFlags &=
167d0 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b   ~SF_MultiValue;
167e0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
167f0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
16800 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b   pSel, &dest) ){
16810 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16820 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
16830 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44   rReg = dest.iSD
16840 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72  Parm;.      Expr
16850 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
16860 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
16870 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
16880 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
16890 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29  ( rHasNullFlag )
168a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
168b0 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70  HasNullFlag(v, p
168c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48  Expr->iTable, rH
168d0 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d  asNullFlag);.  }
168e0 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e  ..  if( jmpIfDyn
168f0 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73  amic>=0 ){.    s
16900 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
16910 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d  re(v, jmpIfDynam
16920 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ic);.  }.  sqlit
16930 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
16940 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72  Parse);..  retur
16950 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66  n rReg;.}.#endif
16960 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
16970 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
16980 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16990 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
169a0 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49  Expr pIn is an I
169b0 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  N(...) expressio
169c0 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  n. This function
169d0 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
169e0 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
169f0 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
16a00 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20  e IN() operator 
16a10 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  has the same num
16a20 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d  ber of .** colum
16a30 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f 72  ns as the vector
16a40 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c   on the LHS. Or,
16a50 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   if the RHS of t
16a60 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a  he IN() is not .
16a70 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20  ** a sub-query, 
16a80 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73 20  that the LHS is 
16a90 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65  a vector of size
16aa0 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   1..*/.int sqlit
16ab0 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61  e3ExprCheckIN(Pa
16ac0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
16ad0 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e  r *pIn){.  int n
16ae0 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Vector = sqlite3
16af0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
16b00 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  In->pLeft);.  if
16b10 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20  ( (pIn->flags & 
16b20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
16b30 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72  .    if( nVector
16b40 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74  !=pIn->x.pSelect
16b50 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
16b60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16b70 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
16b80 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53  Parse, pIn->x.pS
16b90 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
16ba0 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a  Expr, nVector);.
16bb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
16bc0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
16bd0 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a  ( nVector!=1 ){.
16be0 20 20 20 20 69 66 28 20 28 70 49 6e 2d 3e 70 4c      if( (pIn->pL
16bf0 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
16c00 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
16c10 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65      sqlite3Subse
16c20 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
16c30 2c 20 6e 56 65 63 74 6f 72 2c 20 31 29 3b 0a 20  , nVector, 1);. 
16c40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16c50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16c60 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c  pParse, "row val
16c70 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20  ue misused");.  
16c80 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31    }.    return 1
16c90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
16ca0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
16cb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16cc0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
16cd0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
16ce0 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f   an IN expressio
16cf0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  n..**.**      x 
16d00 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
16d10 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61  **      x IN (va
16d20 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
16d30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
16d40 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20  hand side (LHS) 
16d50 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76  is a scalar or v
16d60 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  ector expression
16d70 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74  .  The .** right
16d80 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29  -hand side (RHS)
16d90 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
16da0 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61  zero or more sca
16db0 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61  lar values, or a
16dc0 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49  .** subquery.  I
16dd0 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20 73  f the RHS is a s
16de0 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d  ubquery, the num
16df0 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
16e00 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61  lumns must.** ma
16e10 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
16e20 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
16e30 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c   vector on the L
16e40 48 53 2e 20 20 49 66 20 74 68 65 20 52 48 53 20  HS.  If the RHS 
16e50 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20  is.** a list of 
16e60 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20  values, the LHS 
16e70 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c 61 72  must be a scalar
16e80 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20  . .**.** The IN 
16e90 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72 75 65  operator is true
16ea0 20 69 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75   if the LHS valu
16eb0 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  e is contained w
16ec0 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a  ithin the RHS..*
16ed0 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  * The result is 
16ee0 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53  false if the LHS
16ef0 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e   is definitely n
16f00 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ot in the RHS.  
16f10 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69  The .** result i
16f20 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72  s NULL if the pr
16f30 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48  esence of the LH
16f40 53 20 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e  S in the RHS can
16f50 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72  not be .** deter
16f60 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c  mined due to NUL
16f70 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  Ls..**.** This r
16f80 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
16f90 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73   code that jumps
16fa0 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20   to destIfFalse 
16fb0 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
16fc0 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20  t .** contained 
16fd0 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
16fe0 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73   If due to NULLs
16ff0 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
17000 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a  mine if the LHS.
17010 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ** is contained 
17020 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
17030 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75  jump to destIfNu
17040 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20  ll.  If the LHS 
17050 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  is contained.** 
17060 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74  within the RHS t
17070 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
17080 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20  ..**.** See the 
17090 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72  separate in-oper
170a0 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74  ator.md document
170b0 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68  ation file in th
170c0 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53  e canonical.** S
170d0 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72 65  QLite source tre
170e0 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
170f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
17100 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
17110 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a  ite3ExprCodeIN(.
17120 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
17130 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
17140 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
17150 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
17160 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
17170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17180 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   IN expression *
17190 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61  /.  int destIfFa
171a0 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d  lse,      /* Jum
171b0 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73  p here if LHS is
171c0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
171d0 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  n the RHS */.  i
171e0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20  nt destIfNull   
171f0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
17200 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  e if the results
17210 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65   are unknown due
17220 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a   to NULLs */.){.
17230 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c    int rRhsHasNul
17240 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73  l = 0;  /* Regis
17250 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65  ter that is true
17260 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73   if RHS contains
17270 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a   NULL values */.
17280 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20    int eType;    
17290 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
172a0 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  of the RHS */.  
172b0 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20  int rLhs;       
172c0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
172d0 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65  r(s) holding the
172e0 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20   LHS values */. 
172f0 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20   int rLhsOrig;  
17300 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61         /* LHS va
17310 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65  lues prior to re
17320 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61  ordering by aiMa
17330 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  p[] */.  Vdbe *v
17340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17350 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  * Statement unde
17360 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
17370 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d  /.  int *aiMap =
17380 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70   0;       /* Map
17390 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65   from vector fie
173a0 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75  ld to index colu
173b0 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  mn */.  char *zA
173c0 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ff = 0;       /*
173d0 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
173e0 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73   for comparisons
173f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f   */.  int nVecto
17400 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  r;          /* S
17410 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66  ize of vectors f
17420 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61  or this IN opera
17430 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75  tor */.  int iDu
17440 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  mmy;           /
17450 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65  * Dummy paramete
17460 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63  r to exprCodeVec
17470 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20  tor() */.  Expr 
17480 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
17490 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74   /* The LHS of t
174a0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
174b0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
174c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f            /* loo
174d0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
174e0 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20 20 20  nt destStep2;   
174f0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
17500 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73   jump when NULLs
17510 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20   seen in step 2 
17520 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65  */.  int destSte
17530 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74  p6 = 0;    /* St
17540 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20  art of code for 
17550 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20  Step 6 */.  int 
17560 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20  addrTruthOp;    
17570 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
17580 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65 74 65  opcode that dete
17590 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73  rmines the IN is
175a0 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64   true */.  int d
175b0 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20  estNotNull;     
175c0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
175d0 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   a comparison is
175e0 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65   not true in ste
175f0 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  p 6 */.  int add
17600 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  rTop;          /
17610 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65  * Top of the ste
17620 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20  p-6 loop */ ..  
17630 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
17640 4c 65 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  Left;.  if( sqli
17650 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70  te3ExprCheckIN(p
17660 50 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 20  Parse, pExpr) ) 
17670 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d  return;.  zAff =
17680 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28   exprINAffinity(
17690 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
176a0 20 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69    nVector = sqli
176b0 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
176c0 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
176d0 0a 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a  .  aiMap = (int*
176e0 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
176f0 5a 65 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72  Zero(.      pPar
17700 73 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a  se->db, nVector*
17710 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73  (sizeof(int) + s
17720 69 7a 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31  izeof(char)) + 1
17730 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  .  );.  if( pPar
17740 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
17750 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69  iled ) goto sqli
17760 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f  te3ExprCodeIN_oo
17770 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41  m_error;..  /* A
17780 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74  ttempt to comput
17790 65 20 74 68 65 20 52 48 53 2e 20 41 66 74 65 72  e the RHS. After
177a0 20 74 68 69 73 20 73 74 65 70 2c 20 69 66 20 61   this step, if a
177b0 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
177c0 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58  an.  ** IN_INDEX
177d0 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65  _NOOP is returne
177e0 64 2c 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65  d, the table ope
177f0 6e 65 64 20 69 74 68 20 63 75 72 73 6f 72 20 70  ned ith cursor p
17800 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20  Expr->iTable .  
17810 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
17820 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
17830 20 75 70 20 74 68 65 20 52 48 53 2e 20 49 66 20   up the RHS. If 
17840 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73  IN_INDEX_NOOP is
17850 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20   returned,.  ** 
17860 74 68 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20  the RHS has not 
17870 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20  yet been coded. 
17880 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
17890 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
178a0 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
178b0 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64   /* OOM detected
178c0 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72   prior to this r
178d0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65  outine */.  Vdbe
178e0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
178f0 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29  "begin IN expr")
17900 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c  );.  eType = sql
17910 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
17920 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20  pParse, pExpr,. 
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49              IN_I
17950 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
17960 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  | IN_INDEX_NOOP_
17970 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK,.            
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17990 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
179a0 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26  stIfNull ? 0 : &
179b0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d  rRhsHasNull, aiM
179c0 61 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ap);..  assert( 
179d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
179e0 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54  nVector==1 || eT
179f0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50  ype==IN_INDEX_EP
17a00 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  H.       || eTyp
17a10 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e==IN_INDEX_INDE
17a20 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d  X_ASC || eType==
17a30 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
17a40 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66  ESC .  );.#ifdef
17a50 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
17a60 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20  /* Confirm that 
17a70 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73  aiMap[] contains
17a80 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72   nVector integer
17a90 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
17aa0 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74  0 and.  ** nVect
17ab0 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  or-1. */.  for(i
17ac0 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
17ad0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20  ++){.    int j, 
17ae0 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74  cnt;.    for(cnt
17af0 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b  =j=0; j<nVector;
17b00 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b   j++) if( aiMap[
17b10 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20  j]==i ) cnt++;. 
17b20 20 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d     assert( cnt==
17b30 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  1 );.  }.#endif.
17b40 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c  .  /* Code the L
17b50 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66  HS, the <expr> f
17b60 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
17b70 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48  ...)". If the LH
17b80 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63  S is a .  ** vec
17b90 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20  tor, then it is 
17ba0 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72  stored in an arr
17bb0 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65  ay of nVector re
17bc0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
17bd0 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20   .  ** at r1..  
17be0 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  **.  ** sqlite3F
17bf0 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67  indInIndex() mig
17c00 68 74 20 68 61 76 65 20 72 65 6f 72 64 65 72 65  ht have reordere
17c10 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20  d the fields of 
17c20 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20  the LHS vector. 
17c30 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20   ** so that the 
17c40 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68  fields are in th
17c50 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20  e same order as 
17c60 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65  an existing inde
17c70 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69  x.   The.  ** ai
17c80 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  Map[] array cont
17c90 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66  ains a mapping f
17ca0 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
17cb0 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72   LHS field order
17cc0 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65   to.  ** the fie
17cd0 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61  ld order that ma
17ce0 74 63 68 65 73 20 74 68 65 20 52 48 53 20 69 6e  tches the RHS in
17cf0 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dex..  */.  sqli
17d00 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
17d10 28 70 50 61 72 73 65 29 3b 0a 20 20 72 4c 68 73  (pParse);.  rLhs
17d20 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56  Orig = exprCodeV
17d30 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c  ector(pParse, pL
17d40 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20  eft, &iDummy);. 
17d50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
17d60 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d  tor && aiMap[i]=
17d70 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72  =i; i++){} /* Ar
17d80 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f  e LHS fields reo
17d90 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28  rdered? */.  if(
17da0 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20   i==nVector ){. 
17db0 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73     /* LHS fields
17dc0 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72   are not reorder
17dd0 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d  ed */.    rLhs =
17de0 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c   rLhsOrig;.  }el
17df0 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20  se{.    /* Need 
17e00 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c  to reorder the L
17e10 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64  HS fields accord
17e20 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a  ing to aiMap */.
17e30 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74      rLhs = sqlit
17e40 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
17e50 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b  Parse, nVector);
17e60 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
17e70 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
17e80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17e90 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
17ea0 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72  y, rLhsOrig+i, r
17eb0 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29  Lhs+aiMap[i], 0)
17ec0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17ed0 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64  * If sqlite3Find
17ee0 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f  InIndex() did no
17ef0 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  t find or create
17f00 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
17f10 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20  s.  ** suitable 
17f20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74  for evaluating t
17f30 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
17f40 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73  then evaluate us
17f50 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65  ing a.  ** seque
17f60 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  nce of compariso
17f70 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ns..  **.  ** Th
17f80 69 73 20 69 73 20 73 74 65 70 20 28 31 29 20 69  is is step (1) i
17f90 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f  n the in-operato
17fa0 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61  r.md optimized a
17fb0 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20  lgorithm..  */. 
17fc0 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
17fd0 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_NOOP ){.   
17fe0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
17ff0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
18000 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  t;.    CollSeq *
18010 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
18020 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
18030 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
18040 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f  ;.    int labelO
18050 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
18060 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
18070 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72   int r2, regToFr
18080 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43  ee;.    int regC
18090 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69  kNull = 0;.    i
180a0 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72  nt ii;.    asser
180b0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
180c0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
180d0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
180e0 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d  if( destIfNull!=
180f0 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
18100 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d       regCkNull =
18110 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
18120 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
18130 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18140 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
18150 2c 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65  , rLhs, rLhs, re
18160 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  gCkNull);.    }.
18170 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
18180 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
18190 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d  i++){.      r2 =
181a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
181b0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69  Temp(pParse, pLi
181c0 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c  st->a[ii].pExpr,
181d0 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20   &regToFree);.  
181e0 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c      if( regCkNul
181f0 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  l && sqlite3Expr
18200 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d  CanBeNull(pList-
18210 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b  >a[ii].pExpr) ){
18220 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18230 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18240 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75  _BitAnd, regCkNu
18250 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c  ll, r2, regCkNul
18260 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
18270 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e    if( ii<pList->
18280 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49  nExpr-1 || destI
18290 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c  fNull!=destIfFal
182a0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  se ){.        sq
182b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
182c0 76 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20  v, OP_Eq, rLhs, 
182d0 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20  labelOk, r2,.   
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182f0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
18300 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
18310 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
18320 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70  verageIf(v, ii<p
18330 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  List->nExpr-1);.
18340 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
18350 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c  rageIf(v, ii==pL
18360 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  ist->nExpr-1);. 
18370 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18380 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
18390 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ff[0]);.      }e
183a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
183b0 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d  ert( destIfNull=
183c0 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a  =destIfFalse );.
183d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
183e0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
183f0 4e 65 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66  Ne, rLhs, destIf
18400 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20  False, r2,.     
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18420 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
18430 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20  l, P4_COLLSEQ); 
18440 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18450 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18460 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
18470 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45  zAff[0] | SQLITE
18480 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
18490 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
184a0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
184b0 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46  g(pParse, regToF
184c0 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ree);.    }.    
184d0 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b  if( regCkNull ){
184e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
184f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
18500 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c  sNull, regCkNull
18510 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56  , destIfNull); V
18520 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18530 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18540 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46  eGoto(v, destIfF
18550 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alse);.    }.   
18560 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18570 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
18580 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lOk);.    sqlite
18590 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
185a0 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c  pParse, regCkNul
185b0 6c 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c  l);.    goto sql
185c0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66  ite3ExprCodeIN_f
185d0 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20  inished;.  }..  
185e0 2f 2a 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b  /* Step 2: Check
185f0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c   to see if the L
18600 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  HS contains any 
18610 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49  NULL columns.  I
18620 66 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64  f the.  ** LHS d
18630 6f 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c  oes contain NULL
18640 73 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  s then the resul
18650 74 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  t must be either
18660 20 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a   FALSE or NULL..
18670 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65    ** We will the
18680 6e 20 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72  n skip the binar
18690 79 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20  y search of the 
186a0 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  RHS..  */.  if( 
186b0 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
186c0 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64  IfFalse ){.    d
186d0 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 49  estStep2 = destI
186e0 66 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b  fFalse;.  }else{
186f0 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20 3d  .    destStep2 =
18700 20 64 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c   destStep6 = sql
18710 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18720 6c 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  l(v);.  }.  for(
18730 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
18740 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
18750 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  p = sqlite3Vecto
18760 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 45  rFieldSubexpr(pE
18770 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a  xpr->pLeft, i);.
18780 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
18790 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20  xprCanBeNull(p) 
187a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
187b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
187c0 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c  _IsNull, rLhs+i,
187d0 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20   destStep2);.   
187e0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
187f0 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  v);.    }.  }.. 
18800 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65   /* Step 3.  The
18810 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77   LHS is now know
18820 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  n to be non-NULL
18830 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79  .  Do the binary
18840 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20   search.  ** of 
18850 74 68 65 20 52 48 53 20 75 73 69 6e 67 20 74 68  the RHS using th
18860 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65  e LHS as a probe
18870 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65  .  If found, the
18880 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20   result is.  ** 
18890 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  true..  */.  if(
188a0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
188b0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a  _ROWID ){.    /*
188c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
188d0 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f  he RHS is the RO
188e0 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74  WID of table b-t
188f0 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c  ree and so we al
18900 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74  so.    ** know t
18910 68 61 74 20 74 68 65 20 52 48 53 20 69 73 20 6e  hat the RHS is n
18920 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  on-NULL.  Hence,
18930 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70   we combine step
18940 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a  s 3 and 4.    **
18950 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f   into a single o
18960 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71  pcode. */.    sq
18970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18980 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
18990 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
189a0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 4c 68  destIfFalse, rLh
189b0 73 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  s);.    VdbeCove
189c0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64  rage(v);.    add
189d0 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74  rTruthOp = sqlit
189e0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
189f0 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65  OP_Goto);  /* Re
18a00 74 75 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d  turn True */.  }
18a10 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
18a20 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18a30 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 4c 68 73  P_Affinity, rLhs
18a40 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41  , nVector, 0, zA
18a50 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20  ff, nVector);.  
18a60 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73    if( destIfFals
18a70 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b  e==destIfNull ){
18a80 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e  .      /* Combin
18a90 65 20 53 74 65 70 20 33 20 61 6e 64 20 53 74 65  e Step 3 and Ste
18aa0 70 20 35 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  p 5 into a singl
18ab0 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  e opcode */.    
18ac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18ad0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
18ae0 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
18af0 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
18b00 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c                rL
18b20 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64  hs, nVector); Vd
18b30 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18b40 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65       goto sqlite
18b50 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
18b60 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  shed;.    }.    
18b70 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70  /* Ordinary Step
18b80 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65   3, for the case
18b90 20 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64   where FALSE and
18ba0 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e   NULL are distin
18bb0 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72  ct */.    addrTr
18bc0 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56  uthOp = sqlite3V
18bd0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
18be0 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
18bf0 3e 69 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20  >iTable, 0,.    
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29    rLhs, nVector)
18c30 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
18c40 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  );.  }..  /* Ste
18c50 70 20 34 2e 20 20 49 66 20 74 68 65 20 52 48 53  p 4.  If the RHS
18c60 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
18c70 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20  non-NULL and we 
18c80 64 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a  did not find.  *
18c90 2a 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68  * an match on th
18ca0 65 20 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20  e search above, 
18cb0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
18cc0 6d 75 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20  must be FALSE.. 
18cd0 20 2a 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61   */.  if( rRhsHa
18ce0 73 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72  sNull && nVector
18cf0 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
18d00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18d10 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73  OP_NotNull, rRhs
18d20 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46  HasNull, destIfF
18d30 61 6c 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43  alse);.    VdbeC
18d40 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
18d50 0a 20 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49  .  /* Step 5.  I
18d60 66 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  f we do not care
18d70 20 61 62 6f 75 74 20 74 68 65 20 64 69 66 66 65   about the diffe
18d80 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55  rence between NU
18d90 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53  LL and.  ** FALS
18da0 45 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  E, then just ret
18db0 75 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f  urn false. .  */
18dc0 0a 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c  .  if( destIfFal
18dd0 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29  se==destIfNull )
18de0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
18df0 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
18e00 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20  ;..  /* Step 6: 
18e10 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77  Loop through row
18e20 73 20 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43  s of the RHS.  C
18e30 6f 6d 70 61 72 65 20 65 61 63 68 20 72 6f 77 20  ompare each row 
18e40 74 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a  to the LHS..  **
18e50 20 49 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73   If any comparis
18e60 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  on is NULL, then
18e70 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
18e80 55 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a  ULL.  If all.  *
18e90 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72  * comparisons ar
18ea0 65 20 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65  e FALSE then the
18eb0 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73   final result is
18ec0 20 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a   FALSE..  **.  *
18ed0 2a 20 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c  * For a scalar L
18ee0 48 53 2c 20 69 74 20 69 73 20 73 75 66 66 69 63  HS, it is suffic
18ef0 69 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75  ient to check ju
18f00 73 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  st the first row
18f10 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53  .  ** of the RHS
18f20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  ..  */.  if( des
18f30 74 53 74 65 70 36 20 29 20 73 71 6c 69 74 65 33  tStep6 ) sqlite3
18f40 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18f50 28 76 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a  (v, destStep6);.
18f60 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
18f70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18f80 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70   OP_Rewind, pExp
18f90 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
18fa0 66 46 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43  fFalse);.  VdbeC
18fb0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66  overage(v);.  if
18fc0 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20  ( nVector>1 ){. 
18fd0 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d     destNotNull =
18fe0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18ff0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73  Label(v);.  }els
19000 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56  e{.    /* For nV
19010 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e  ector==1, combin
19020 65 20 73 74 65 70 73 20 36 20 61 6e 64 20 37 20  e steps 6 and 7 
19030 62 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  by immediately r
19040 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  eturning.    ** 
19050 46 41 4c 53 45 20 69 66 20 74 68 65 20 66 69 72  FALSE if the fir
19060 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  st comparison is
19070 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20   not NULL */.   
19080 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64   destNotNull = d
19090 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a  estIfFalse;.  }.
190a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
190b0 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
190c0 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c  Expr *p;.    Col
190d0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
190e0 20 69 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65   int r3 = sqlite
190f0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
19100 73 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  se);.    p = sql
19110 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
19120 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29  ubexpr(pLeft, i)
19130 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
19140 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
19150 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
19160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19170 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
19180 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
19190 69 2c 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69  i, r3);.    sqli
191a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
191b0 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20   OP_Ne, rLhs+i, 
191c0 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c  destNotNull, r3,
191d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
191e0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
191f0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
19200 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
19210 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
19220 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19230 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20  (pParse, r3);.  
19240 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
19250 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
19260 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  , 0, destIfNull)
19270 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e  ;.  if( nVector>
19280 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
19290 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
192a0 28 76 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29  (v, destNotNull)
192b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
192c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
192d0 78 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  xt, pExpr->iTabl
192e0 65 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  e, addrTop+1);. 
192f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
19300 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70  v);..    /* Step
19310 20 37 3a 20 20 49 66 20 77 65 20 72 65 61 63 68   7:  If we reach
19320 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
19330 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72 65  know that the re
19340 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a  sult must.    **
19350 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20   be false. */.  
19360 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19370 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
19380 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  0, destIfFalse);
19390 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73  .  }..  /* Jumps
193a0 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74   here in order t
193b0 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a  o return true. *
193c0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
193d0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
193e0 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65  ruthOp);..sqlite
193f0 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
19400 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73  shed:.  if( rLhs
19410 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c  !=rLhsOrig ) sql
19420 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19430 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29  eg(pParse, rLhs)
19440 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
19450 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
19460 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
19470 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22  v, "end IN expr"
19480 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43  ));.sqlite3ExprC
19490 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a  odeIN_oom_error:
194a0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
194b0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d  (pParse->db, aiM
194c0 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ap);.  sqlite3Db
194d0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
194e0 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66   zAff);.}.#endif
194f0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19500 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
19510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19520 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
19530 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
19540 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
19550 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
19560 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
19570 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65  * value describe
19580 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  d by z[0..n-1] i
19590 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
195a0 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
195b0 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
195c0 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
195d0 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
195e0 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
195f0 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
19600 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
19610 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
19620 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
19630 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
19640 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
19650 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
19660 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20  d codeReal(Vdbe 
19670 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
19680 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  z, int negateFla
19690 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
196a0 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29  if( ALWAYS(z!=0)
196b0 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
196c0 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  alue;.    sqlite
196d0 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c  3AtoF(z, &value,
196e0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
196f0 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (z), SQLITE_UTF8
19700 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
19710 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c  sqlite3IsNaN(val
19720 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65  ue) ); /* The ne
19730 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74  w AtoF never ret
19740 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20  urns NaN */.    
19750 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29  if( negateFlag )
19760 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
19770 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19780 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
19790 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20  _Real, 0, iMem, 
197a0 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
197b0 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a  P4_REAL);.  }.}.
197c0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47  #endif.../*.** G
197d0 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
197e0 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
197f0 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
19800 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
19810 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  text z[0..n-1] i
19820 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
19830 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e  m..**.** Expr.u.
19840 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73  zToken is always
19850 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74   UTF8 and zero-t
19860 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74  erminated..*/.st
19870 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
19880 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61  teger(Parse *pPa
19890 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
198a0 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69  , int negFlag, i
198b0 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65  nt iMem){.  Vdbe
198c0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
198d0 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72  dbe;.  if( pExpr
198e0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
198f0 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74  Value ){.    int
19900 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56   i = pExpr->u.iV
19910 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  alue;.    assert
19920 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( i>=0 );.    if
19930 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20  ( negFlag ) i = 
19940 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -i;.    sqlite3V
19950 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19960 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d  Integer, i, iMem
19970 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19980 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76  int c;.    i64 v
19990 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  alue;.    const 
199a0 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d  char *z = pExpr-
199b0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61  >u.zToken;.    a
199c0 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
199d0 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65     c = sqlite3De
199e0 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26  cOrHexToI64(z, &
199f0 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20  value);.    if( 
19a00 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26  c==0 || (c==2 &&
19a10 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20   negFlag) ){.   
19a20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
19a30 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f  { value = c==2 ?
19a40 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
19a50 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20  : -value; }.    
19a60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19a70 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e  Op4Dup8(v, OP_In
19a80 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  t64, 0, iMem, 0,
19a90 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
19aa0 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
19ab0 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
19ac0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
19ad0 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
19ae0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19af0 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
19b00 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
19b10 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
19b20 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66  ", z);.#else.#if
19b30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19b40 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20  _HEX_INTEGER.   
19b50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
19b60 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32  trnicmp(z,"0x",2
19b70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
19b80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19b90 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74  pParse, "hex lit
19ba0 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73  eral too big: %s
19bb0 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", z);.      }el
19bc0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
19bd0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  {.        codeRe
19be0 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
19bf0 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , iMem);.      }
19c00 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
19c10 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
19c20 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
19c30 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 65 20  *.** Verify the 
19c40 63 6f 6e 73 69 73 74 65 6e 63 79 20 6f 66 20 74  consistency of t
19c50 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 0a  he column cache.
19c60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
19c70 63 68 65 49 73 56 61 6c 69 64 28 50 61 72 73 65  cheIsValid(Parse
19c80 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
19c90 20 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e   i, n;.  for(i=n
19ca0 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  =0; i<SQLITE_N_C
19cb0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 29 7b 0a 20  OLCACHE; i++){. 
19cc0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
19cd0 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
19ce0 3e 30 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  >0 ) n++;.  }.  
19cf0 72 65 74 75 72 6e 20 6e 3d 3d 70 50 61 72 73 65  return n==pParse
19d00 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 7d 0a 23  ->nColCache;.}.#
19d10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  endif../*.** Cle
19d20 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79  ar a cache entry
19d30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19d40 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
19d50 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19d60 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
19d70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
19d80 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
19d90 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
19da0 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
19db0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
19dc0 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
19dd0 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
19de0 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
19df0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
19e00 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
19e10 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 52 65 67 20  ;.  }.  p->iReg 
19e20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
19e30 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 61 73  ColCache--;.  as
19e40 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
19e50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
19e60 7c 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70  | cacheIsValid(p
19e70 50 61 72 73 65 29 20 29 3b 0a 7d 0a 0a 0a 2f 2a  Parse) );.}.../*
19e80 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68  .** Record in th
19e90 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74  e column cache t
19ea0 68 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72  hat a particular
19eb0 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a   column from a.*
19ec0 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  * particular tab
19ed0 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  le is stored in 
19ee0 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67  a particular reg
19ef0 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ister..*/.void s
19f00 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
19f10 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  tore(Parse *pPar
19f20 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e  se, int iTab, in
19f30 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67  t iCol, int iReg
19f40 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
19f50 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20  t minLru;.  int 
19f60 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74  idxLru;.  struct
19f70 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
19f80 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65    /* Unless an e
19f90 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
19fa0 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  d, register numb
19fb0 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70  ers are always p
19fc0 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73  ositive. */.  as
19fd0 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20  sert( iReg>0 || 
19fe0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
19ff0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1a000 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73  ocFailed );.  as
1a010 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
1a020 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
1a030 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
1a040 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
1a050 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f  /* The SQLITE_Co
1a060 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64  lumnCache flag d
1a070 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75  isables the colu
1a080 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  mn cache.  This 
1a090 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72  is used.  ** for
1a0a0 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20   testing only - 
1a0b0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53  to verify that S
1a0c0 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74  QLite always get
1a0d0 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  s the same answe
1a0e0 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20  r.  ** with and 
1a0f0 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75  without the colu
1a100 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  mn cache..  */. 
1a110 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
1a120 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65  nDisabled(pParse
1a130 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c  ->db, SQLITE_Col
1a140 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75  umnCache) ) retu
1a150 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20  rn;..  /* First 
1a160 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73  replace any exis
1a170 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a  ting entry..  **
1a180 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
1a190 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75  the way the colu
1a1a0 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72  mn cache is curr
1a1b0 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61  ently used, we a
1a1c0 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20  re guaranteed.  
1a1d0 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65  ** that the obje
1a1e0 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c  ct will never al
1a1f0 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68  ready be in cach
1a200 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20  e.  Verify this 
1a210 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a  guarantee..  */.
1a220 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1a230 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1a240 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1a250 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
1a260 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
1a270 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52     assert( p->iR
1a280 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62  eg==0 || p->iTab
1a290 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69  le!=iTab || p->i
1a2a0 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a  Column!=iCol );.
1a2b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1a2c0 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73   Find an empty s
1a2d0 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20  lot and replace 
1a2e0 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  it */.  for(i=0,
1a2f0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1a300 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
1a310 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
1a320 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
1a330 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >iReg==0 ){.    
1a340 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
1a350 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1a360 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62  l;.      p->iTab
1a370 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  le = iTab;.     
1a380 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
1a390 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  ol;.      p->iRe
1a3a0 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20  g = iReg;.      
1a3b0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
1a3c0 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
1a3d0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
1a3e0 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
1a3f0 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  ->nColCache++;. 
1a400 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1a410 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1a420 61 69 6c 65 64 20 7c 7c 20 63 61 63 68 65 49 73  ailed || cacheIs
1a430 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b  Valid(pParse) );
1a440 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
1a450 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
1a460 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20  eplace the last 
1a470 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f  recently used */
1a480 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66  .  minLru = 0x7f
1a490 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75  ffffff;.  idxLru
1a4a0 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30   = -1;.  for(i=0
1a4b0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1a4c0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
1a4d0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
1a4e0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
1a4f0 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a  ->lru<minLru ){.
1a500 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69        idxLru = i
1a510 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d  ;.      minLru =
1a520 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20   p->lru;.    }. 
1a530 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28   }.  if( ALWAYS(
1a540 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20  idxLru>=0) ){.  
1a550 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
1a560 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d  ColCache[idxLru]
1a570 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20  ;.    p->iLevel 
1a580 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1a590 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54  Level;.    p->iT
1a5a0 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20  able = iTab;.   
1a5b0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
1a5c0 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20  ol;.    p->iReg 
1a5d0 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74  = iReg;.    p->t
1a5e0 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
1a5f0 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
1a600 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
1a610 20 20 61 73 73 65 72 74 28 20 63 61 63 68 65 49    assert( cacheI
1a620 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29  sValid(pParse) )
1a630 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1a640 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  }.}../*.** Indic
1a650 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65  ate that registe
1a660 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e  rs between iReg.
1a670 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65  .iReg+nReg-1 are
1a680 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
1a690 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  en..** Purge the
1a6a0 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
1a6b0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ers from the col
1a6c0 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f  umn cache..*/.vo
1a6d0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1a6e0 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20  cheRemove(Parse 
1a6f0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
1a700 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
1a710 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1a720 20 2a 70 3b 0a 20 20 69 66 28 20 69 52 65 67 3c   *p;.  if( iReg<
1a730 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 43  =0 || pParse->nC
1a740 6f 6c 43 61 63 68 65 3d 3d 30 20 29 20 72 65 74  olCache==0 ) ret
1a750 75 72 6e 3b 0a 20 20 70 20 3d 20 26 70 50 61 72  urn;.  p = &pPar
1a760 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 53 51  se->aColCache[SQ
1a770 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 2d  LITE_N_COLCACHE-
1a780 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  1];.  while(1){.
1a790 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
1a7a0 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52  >= iReg && p->iR
1a7b0 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29  eg < iReg+nReg )
1a7c0 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
1a7d0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
1a7e0 20 69 66 28 20 70 3d 3d 70 50 61 72 73 65 2d 3e   if( p==pParse->
1a7f0 61 43 6f 6c 43 61 63 68 65 20 29 20 62 72 65 61  aColCache ) brea
1a800 6b 3b 0a 20 20 20 20 70 2d 2d 3b 0a 20 20 7d 0a  k;.    p--;.  }.
1a810 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
1a820 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
1a830 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65  lumn cache conte
1a840 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74  xt.  Any new ent
1a850 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64  ries added.** ad
1a860 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  ded to the colum
1a870 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  n cache after th
1a880 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f  is call are remo
1a890 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ved when the.** 
1a8a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
1a8b0 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  p occurs..*/.voi
1a8c0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1a8d0 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  hePush(Parse *pP
1a8e0 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
1a8f0 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a  >iCacheLevel++;.
1a900 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1a910 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
1a920 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1a930 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1a940 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
1a950 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22  f("PUSH to %d\n"
1a960 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
1a970 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
1a980 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
1a990 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  ve from the colu
1a9a0 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74  mn cache any ent
1a9b0 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61  ries that were a
1a9c0 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a  dded since the.*
1a9d0 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  * the previous s
1a9e0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1a9f0 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ush operation.  
1aa00 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1aa10 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63  restore.** the c
1aa20 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74  ache to the stat
1aa30 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f  e it was in prio
1aa40 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
1aa50 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20  t Push..*/.void 
1aa60 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1aa70 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
1aa80 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  e){.  int i;.  s
1aa90 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1aaa0 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  *p;.  assert( pP
1aab0 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1aac0 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65  l>=1 );.  pParse
1aad0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b  ->iCacheLevel--;
1aae0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1aaf0 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1ab00 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1ab10 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1ab20 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1ab30 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e  tf("POP  to %d\n
1ab40 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
1ab50 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
1ab60 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  dif.  for(i=0, p
1ab70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1ab80 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
1ab90 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
1aba0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
1abb0 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c  Reg && p->iLevel
1abc0 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c  >pParse->iCacheL
1abd0 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61  evel ){.      ca
1abe0 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
1abf0 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  arse, p);.    }.
1ac00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
1ac10 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d  n a cached colum
1ac20 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b  n is reused, mak
1ac30 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20  e sure that its 
1ac40 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e  register is.** n
1ac50 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62  o longer availab
1ac60 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67  le as a temp reg
1ac70 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23  ister.  ticket #
1ac80 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65  3879:  that same
1ac90 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67  .** register mig
1aca0 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ht be in the cac
1acb0 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  he in multiple p
1acc0 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72  laces, so be sur
1acd0 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d  e to.** get them
1ace0 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   all..*/.static 
1acf0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1ad00 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
1ad10 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ad20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
1ad30 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1ad40 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
1ad50 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1ad60 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
1ad70 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
1ad80 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1ad90 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
1ada0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d   ){.      p->tem
1adb0 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
1adc0 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61    }.}../* Genera
1add0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1ade0 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69  l load into regi
1adf0 73 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61  ster regOut a va
1ae00 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  lue that is.** a
1ae10 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
1ae20 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f  he iIdxCol-th co
1ae30 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
1ae40 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  dx..*/.void sqli
1ae50 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49  te3ExprCodeLoadI
1ae60 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  ndexColumn(.  Pa
1ae70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a  rse *pParse,  /*
1ae80 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1ae90 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
1aea0 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65  *pIdx,    /* The
1aeb0 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c   index whose col
1aec0 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61  umn is to be loa
1aed0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ded */.  int iTa
1aee0 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73  bCur,    /* Curs
1aef0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  or pointing to a
1af00 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20   table row */.  
1af10 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20  int iIdxCol,    
1af20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  /* The column of
1af30 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   the index to be
1af40 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74   loaded */.  int
1af50 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
1af60 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20  Store the index 
1af70 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1af80 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
1af90 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f  .){.  i16 iTabCo
1afa0 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
1afb0 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69  mn[iIdxCol];.  i
1afc0 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45  f( iTabCol==XN_E
1afd0 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  XPR ){.    asser
1afe0 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  t( pIdx->aColExp
1aff0 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
1b000 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1b010 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29  >nExpr>iIdxCol )
1b020 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53  ;.    pParse->iS
1b030 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72  elfTab = iTabCur
1b040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1b050 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65  rCodeCopy(pParse
1b060 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  , pIdx->aColExpr
1b070 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78  ->a[iIdxCol].pEx
1b080 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  pr, regOut);.  }
1b090 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1b0a0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1b0b0 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65  mnOfTable(pParse
1b0c0 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70  ->pVdbe, pIdx->p
1b0d0 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a  Table, iTabCur,.
1b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b100 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67      iTabCol, reg
1b110 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
1b120 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1b130 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   to extract the 
1b140 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f  value of the iCo
1b150 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  l-th column of a
1b160 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
1b170 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1b180 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1b190 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
1b1a0 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75     /* The VDBE u
1b1b0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1b1c0 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
1b1d0 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ab,    /* The ta
1b1e0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1b1f0 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  he value */.  in
1b200 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
1b210 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   The table curso
1b220 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75  r.  Or the PK cu
1b230 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54  rsor for WITHOUT
1b240 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20   ROWID */.  int 
1b250 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49  iCol,       /* I
1b260 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
1b270 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f  mn to extract */
1b280 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
1b290 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
1b2a0 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69  e value into thi
1b2b0 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
1b2c0 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c  .  if( iCol<0 ||
1b2d0 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
1b2e0 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
1b2f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b300 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72  P_Rowid, iTabCur
1b310 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
1b320 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d  se{.    int op =
1b330 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
1b340 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20   ? OP_VColumn : 
1b350 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  OP_Column;.    i
1b360 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  nt x = iCol;.   
1b370 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
1b380 54 61 62 29 20 26 26 20 21 49 73 56 69 72 74 75  Tab) && !IsVirtu
1b390 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
1b3a0 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c    x = sqlite3Col
1b3b0 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74  umnOfIndex(sqlit
1b3c0 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
1b3d0 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a  x(pTab), iCol);.
1b3e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1b3f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
1b400 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72  p, iTabCur, x, r
1b410 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66  egOut);.  }.  if
1b420 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
1b430 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
1b440 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
1b450 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1b460 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1b470 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1b480 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69  ll extract the i
1b490 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e  Column-th column
1b4a0 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70   from.** table p
1b4b0 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68  Tab and store th
1b4c0 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1b4d0 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a  n a register. .*
1b4e0 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69  *.** An effort i
1b4f0 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
1b500 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
1b510 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1b520 67 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e  g.  This.** is n
1b530 6f 74 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f  ot garanteeed fo
1b540 72 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20  r GetColumn() - 
1b550 74 68 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62  the result can b
1b560 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61  e stored in.** a
1b570 6e 79 20 72 65 67 69 73 74 65 72 2e 20 20 42 75  ny register.  Bu
1b580 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  t the result is 
1b590 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61  guaranteed to la
1b5a0 6e 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  nd in register i
1b5b0 52 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f  Reg.** for GetCo
1b5c0 6c 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a  lumnToReg()..**.
1b5d0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
1b5e0 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
1b5f0 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c  to pTab in iTabl
1b600 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
1b610 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
1b620 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20  .  If iColumn<0 
1b630 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e  then code is gen
1b640 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72  erated that extr
1b650 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a  acts the rowid..
1b660 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1b670 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1b680 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1b690 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
1b6a0 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1b6b0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1b6c0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1b6d0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1b6e0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
1b6f0 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
1b700 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
1b710 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
1b720 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1b730 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
1b740 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
1b750 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
1b760 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
1b770 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20  .  int iReg,    
1b780 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
1b790 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75  ults here */.  u
1b7a0 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20  8 p5            
1b7b0 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20  /* P5 value for 
1b7c0 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47  OP_Column + FLAG
1b7d0 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  S */.){.  Vdbe *
1b7e0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1b7f0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1b800 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1b810 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
1b820 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
1b830 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
1b840 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
1b850 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
1b860 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62  Reg>0 && p->iTab
1b870 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d  le==iTable && p-
1b880 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  >iColumn==iColum
1b890 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72  n ){.      p->lr
1b8a0 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
1b8b0 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  heCnt++;.      s
1b8c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1b8d0 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73  inRegister(pPars
1b8e0 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20  e, p->iReg);.   
1b8f0 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65     return p->iRe
1b900 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20  g;.    }.  }  . 
1b910 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
1b920 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
1b930 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1b940 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62  le(v, pTab, iTab
1b950 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
1b960 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a  g);.  if( p5 ){.
1b970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1b980 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a  hangeP5(v, p5);.
1b990 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20    }else{   .    
1b9a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1b9b0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54  Store(pParse, iT
1b9c0 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
1b9d0 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Reg);.  }.  retu
1b9e0 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20  rn iReg;.}.void 
1b9f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1ba00 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20  etColumnToReg(. 
1ba10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1ba20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1ba30 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1ba40 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1ba50 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
1ba60 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1ba70 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
1ba80 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
1ba90 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
1baa0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1bab0 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1bac0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
1bad0 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
1bae0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1baf0 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
1bb00 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20   int iReg       
1bb10 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
1bb20 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
1bb30 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
1bb40 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1bb50 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
1bb60 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c  iColumn, iTable,
1bb70 20 69 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28   iReg, 0);.  if(
1bb80 20 72 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69   r1!=iReg ) sqli
1bb90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
1bba0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1bbb0 53 43 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29  SCopy, r1, iReg)
1bbc0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}.../*.** Clea
1bbd0 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63  r all column cac
1bbe0 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76  he entries..*/.v
1bbf0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1bc00 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20  acheClear(Parse 
1bc10 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
1bc20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1bc30 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53  Cache *p;..#if S
1bc40 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1bc50 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
1bc60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
1bc70 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
1bc80 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52     printf("CLEAR
1bc90 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  \n");.  }.#endif
1bca0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
1bcb0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1bcc0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
1bcd0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
1bce0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
1bcf0 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
1bd00 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
1bd10 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , p);.    }.  }.
1bd20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
1bd30 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e  the fact that an
1bd40 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
1bd50 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e   has occurred on
1bd60 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73   iCount.** regis
1bd70 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69  ters starting wi
1bd80 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f  th iStart..*/.vo
1bd90 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1bda0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1bdb0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1bdc0 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74   int iStart, int
1bdd0 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69   iCount){.  sqli
1bde0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
1bdf0 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61 72  ve(pParse, iStar
1be00 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f  t, iCount);.}../
1be10 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1be20 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65  de to move conte
1be30 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  nt from register
1be40 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b  s iFrom...iFrom+
1be50 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74  nReg-1.** over t
1be60 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d  o iTo..iTo+nReg-
1be70 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75  1. Keep the colu
1be80 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64  mn cache up-to-d
1be90 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ate..*/.void sql
1bea0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
1beb0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1bec0 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
1bed0 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
1bee0 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d   assert( iFrom>=
1bef0 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f  iTo+nReg || iFro
1bf00 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20  m+nReg<=iTo );. 
1bf10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bf20 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
1bf30 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d  , OP_Move, iFrom
1bf40 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20  , iTo, nReg);.  
1bf50 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1bf60 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
1bf70 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a  From, nReg);.}..
1bf80 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1bf90 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
1bfa0 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
1bfb0 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
1bfc0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1bfd0 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20  any register in 
1bfe0 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e  the range iFrom.
1bff0 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29  .iTo (inclusive)
1c000 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70  .** is used as p
1c010 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  art of the colum
1c020 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  n cache..**.** T
1c030 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1c040 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72  sed within asser
1c050 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65  t() and testcase
1c060 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a  () macros only.*
1c070 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61  * and does not a
1c080 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61  ppear in a norma
1c090 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  l build..*/.stat
1c0a0 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c  ic int usedAsCol
1c0b0 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a  umnCache(Parse *
1c0c0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
1c0d0 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69  m, int iTo){.  i
1c0e0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1c0f0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
1c100 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1c110 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
1c120 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1c130 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1c140 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67   int r = p->iReg
1c150 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72  ;.    if( r>=iFr
1c160 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72  om && r<=iTo ) r
1c170 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f  eturn 1;    /*NO
1c180 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65  _TEST*/.  }.  re
1c190 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1c1a0 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1c1b0 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52   || SQLITE_COVER
1c1c0 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a  AGE_TEST */.../*
1c1d0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63  .** Convert a sc
1c1e0 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  alar expression 
1c1f0 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47  node to a TK_REG
1c200 49 53 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e  ISTER referencin
1c210 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52  g.** register iR
1c220 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  eg.  The caller 
1c230 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
1c240 20 69 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f   iReg already co
1c250 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f  ntains.** the co
1c260 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
1c270 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
1c280 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1c290 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78  xprToRegister(Ex
1c2a0 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29  pr *p, int iReg)
1c2b0 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e  {.  p->op2 = p->
1c2c0 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  op;.  p->op = TK
1c2d0 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e  _REGISTER;.  p->
1c2e0 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20  iTable = iReg;. 
1c2f0 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
1c300 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a  ty(p, EP_Skip);.
1c310 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74  }../*.** Evaluat
1c320 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1c330 28 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72  (either a vector
1c340 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70   or a scalar exp
1c350 72 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f  ression) and sto
1c360 72 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  re.** the result
1c370 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20   in continguous 
1c380 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1c390 65 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ers.  Return the
1c3a0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
1c3b0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
1c3c0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
1c3d0 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
1c3e0 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
1c3f0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
1c400 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73  is a temporary s
1c410 63 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f  calar, then also
1c420 20 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72   write.** that r
1c430 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69  egister number i
1c440 6e 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e  nto *piFreeable.
1c450 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65    If the returne
1c460 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  d result registe
1c470 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65  r.** is not a te
1c480 6d 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68  mporary or if th
1c490 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1c4a0 61 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69  a vector set *pi
1c4b0 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30  Freeable.** to 0
1c4c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c4d0 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50  exprCodeVector(P
1c4e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1c4f0 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72  pr *p, int *piFr
1c500 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  eeable){.  int i
1c510 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52  Result;.  int nR
1c520 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  esult = sqlite3E
1c530 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29  xprVectorSize(p)
1c540 3b 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d  ;.  if( nResult=
1c550 3d 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c  =1 ){.    iResul
1c560 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
1c570 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1c580 70 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a  p, piFreeable);.
1c590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69    }else{.    *pi
1c5a0 46 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20  Freeable = 0;.  
1c5b0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
1c5c0 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
1c5d0 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  iResult = sqlite
1c5e0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
1c5f0 50 61 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b  Parse, p, 0, 0);
1c600 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c610 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
1c620 52 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d  Result = pParse-
1c630 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70  >nMem+1;.      p
1c640 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1c650 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f  Result;.      fo
1c660 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74  r(i=0; i<nResult
1c670 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1c680 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1c690 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69  pParse, p->x.pLi
1c6a0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1c6b0 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  i+iResult);.    
1c6c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1c6d0 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a  return iResult;.
1c6e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1c6f0 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
1c700 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
1c710 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
1c720 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1c730 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
1c740 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1c750 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
1c760 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1c770 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1c780 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1c790 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1c7a0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1c7b0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1c7c0 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1c7d0 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1c7e0 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1c7f0 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1c800 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1c810 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1c820 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1c830 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1c840 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1c850 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1c860 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1c870 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1c880 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1c890 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1c8a0 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1c8b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c8c0 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1c8d0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1c8e0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1c8f0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1c900 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1c910 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1c920 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1c930 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1c940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1c950 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1c960 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1c970 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1c980 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1c990 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1c9a0 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1c9b0 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1c9c0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1c9d0 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1c9e0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1c9f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1ca00 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1ca10 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1ca20 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1ca30 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1ca40 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1ca50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1ca60 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1ca70 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  mbers */.  sqlit
1ca80 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1ca90 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
1caa0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1cab0 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b  */.  Expr tempX;
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cad0 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72  * Temporary expr
1cae0 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20  ession node */. 
1caf0 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20   int p5 = 0;..  
1cb00 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1cb10 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
1cb20 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
1cb30 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ( v==0 ){.    as
1cb40 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1cb50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1cb60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1cb70 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72    }..  if( pExpr
1cb80 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
1cb90 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
1cba0 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
1cbb0 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
1cbc0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1cbd0 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
1cbe0 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
1cbf0 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
1cc00 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
1cc10 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
1cc20 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
1cc30 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
1cc40 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
1cc50 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
1cc60 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
1cc70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1cc80 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
1cc90 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1cca0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
1ccb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ccc0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
1ccd0 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
1cce0 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
1ccf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1cd00 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
1cd10 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
1cd20 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20  IdxPTab,.       
1cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd40 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1cd50 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  rterColumn, targ
1cd60 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
1cd70 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1cd80 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1cd90 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
1cda0 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
1cdb0 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
1cdc0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1cdd0 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20  .      int iTab 
1cde0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1cdf0 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c  .      if( iTab<
1ce00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1ce10 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
1ce20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1ce30 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1ce40 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1ce50 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1ce60 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1ce70 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 52 65  /.          inRe
1ce80 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
1ce90 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42  mn + pParse->ckB
1cea0 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ase;.          b
1ceb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1cec0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1ced0 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1cee0 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1cef0 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1cf00 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1cf10 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1cf20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1cf30 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1cf40 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1cf50 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1cf60 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1cf70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b  Parse->iSelfTab;
1cf80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cf90 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
1cfa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1cfb0 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1cfc0 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20  , pExpr->pTab,. 
1cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1cff0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
1d000 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d020 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1d030 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72  ->op2);.      br
1d040 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1d050 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
1d060 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
1d070 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ger(pParse, pExp
1d080 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1d090 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d0a0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1d0b0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1d0c0 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
1d0d0 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1d0e0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1d0f0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1d100 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1d110 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1d120 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1d130 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
1d140 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d150 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1d160 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
1d170 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1d180 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1d190 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1d1a0 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
1d1b0 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
1d1c0 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70  (v, target, pExp
1d1d0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1d1e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d1f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1d200 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
1d210 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d220 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
1d230 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
1d240 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1d250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
1d260 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
1d270 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
1d280 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1d290 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
1d2a0 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
1d2b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d2c0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1d2d0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1d2e0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1d2f0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1d300 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
1d310 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1d320 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
1d330 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1d340 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
1d350 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
1d360 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
1d370 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
1d380 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1d390 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
1d3a0 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
1d3b0 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
1d3c0 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
1d3d0 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
1d3e0 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
1d3f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d400 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
1d410 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
1d420 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
1d430 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1d440 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1d450 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
1d460 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
1d470 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1d480 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1d490 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1d4a0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1d4b0 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
1d4c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1d4d0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
1d4e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1d4f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d500 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
1d510 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
1d520 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1d530 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1d540 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
1d550 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1d560 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f  >u.zToken[0]=='?
1d570 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
1d580 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d  || strcmp(pExpr-
1d590 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73  >u.zToken, pPars
1d5a0 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e  e->azVar[pExpr->
1d5b0 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29  iColumn-1])==0 )
1d5c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1d5d0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
1d5e0 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56   -1, pParse->azV
1d5f0 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
1d600 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29  n-1], P4_STATIC)
1d610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d620 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1d630 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1d640 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
1d650 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
1d660 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d670 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1d680 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
1d690 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
1d6a0 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
1d6b0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
1d6c0 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
1d6d0 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
1d6e0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1d6f0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1d700 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
1d710 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
1d720 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
1d730 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
1d740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d750 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1d760 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
1d770 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1d780 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
1d790 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1d7a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d7b0 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20  _Cast, target,. 
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66         sqlite3Af
1d7e0 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
1d7f0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b  ->u.zToken, 0));
1d800 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d810 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
1d820 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  he(pParse, inReg
1d830 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20  , inReg) );.    
1d840 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1d850 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1d860 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1d870 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
1d880 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1d890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
1d8a0 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
1d8b0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
1d8c0 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70  _ISNOT:.      op
1d8d0 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
1d8e0 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
1d8f0 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54        p5 = SQLIT
1d900 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
1d910 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20  /* fall-through 
1d920 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
1d930 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1d940 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1d950 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1d960 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1d970 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1d980 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  Q: {.      Expr 
1d990 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
1d9a0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28  pLeft;.      if(
1d9b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
1d9c0 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20  ctor(pLeft) ){. 
1d9d0 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f         codeVecto
1d9e0 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
1d9f0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
1da00 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d  op, p5);.      }
1da10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
1da20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1da30 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1da40 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1da50 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1da60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1da70 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1da80 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1da90 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ee2);.        co
1daa0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1dab0 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  , pLeft, pExpr->
1dac0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1dad0 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1dae0 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
1daf0 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20  OREP2 | p5);.   
1db00 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1db10 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
1db20 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
1db30 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1db40 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
1db50 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1db60 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
1db70 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
1db80 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1db90 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
1dba0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1dbb0 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
1dbc0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
1dbd0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1dbe0 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
1dbf0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1dc00 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
1dc10 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
1dc20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1dc30 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
1dc40 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
1dc50 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
1dc60 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20  ase(op==OP_Eq); 
1dc70 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1dc80 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  ,op==OP_Eq);.   
1dc90 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
1dca0 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
1dcb0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
1dcc0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1dcd0 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
1dce0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1dcf0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1dd00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dd10 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1dd20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1dd30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1dd40 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
1dd50 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
1dd60 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
1dd70 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
1dd80 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
1dd90 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
1dda0 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
1ddb0 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
1ddc0 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
1ddd0 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
1dde0 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
1ddf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
1de00 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54  IFT: .    case T
1de10 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
1de20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44    assert( TK_AND
1de30 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20  ==OP_And );     
1de40 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1de50 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20   op==TK_AND );. 
1de60 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1de70 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20  OR==OP_Or );    
1de80 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1de90 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
1dea0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1deb0 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
1dec0 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;           test
1ded0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55  case( op==TK_PLU
1dee0 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
1def0 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f  t( TK_MINUS==OP_
1df00 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20  Subtract );     
1df10 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1df20 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20  _MINUS );.      
1df30 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d  assert( TK_REM==
1df40 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20  OP_Remainder ); 
1df50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1df60 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20  p==TK_REM );.   
1df70 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1df80 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
1df90 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1dfa0 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20  ( op==TK_BITAND 
1dfb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1dfc0 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
1dfd0 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65  tOr );        te
1dfe0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
1dff0 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  ITOR );.      as
1e000 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
1e010 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20  OP_Divide );    
1e020 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e030 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
1e040 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
1e050 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
1e060 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ft );   testcase
1e070 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
1e080 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e090 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
1e0a0 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65  hiftRight );  te
1e0b0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
1e0c0 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
1e0d0 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
1e0e0 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20  ==OP_Concat );  
1e0f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e100 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20  ==TK_CONCAT );. 
1e110 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1e120 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e130 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e140 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1e150 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1e160 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e170 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1e180 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1e190 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e1a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1e1b0 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
1e1c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e1d0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1e1e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e1f0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1e200 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e210 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
1e220 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
1e230 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1e240 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1e250 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
1e260 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
1e270 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
1e280 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  R ){.        cod
1e290 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
1e2a0 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65   pLeft, 1, targe
1e2b0 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
1e2c0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1e2d0 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c  _POINT.      }el
1e2e0 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  se if( pLeft->op
1e2f0 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  ==TK_FLOAT ){.  
1e300 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1e310 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1e320 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1e330 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  e) );.        co
1e340 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d  deReal(v, pLeft-
1e350 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61  >u.zToken, 1, ta
1e360 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rget);.#endif.  
1e370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e380 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b     tempX.op = TK
1e390 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
1e3a0 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20    tempX.flags = 
1e3b0 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54  EP_IntValue|EP_T
1e3c0 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20  okenOnly;.      
1e3d0 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65    tempX.u.iValue
1e3e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31   = 0;.        r1
1e3f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e400 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
1e410 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31  tempX, &regFree1
1e420 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
1e430 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e440 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1e450 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1e460 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee2);.        sq
1e470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1e480 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
1e490 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1e4a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1e4b0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1e4c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e4d0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
1e4e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e4f0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
1e500 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
1e510 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
1e520 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
1e530 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20  T==OP_BitNot ); 
1e540 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e550 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20  TK_BITNOT );.   
1e560 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1e570 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20  T==OP_Not );    
1e580 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e590 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
1e5a0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1e5b0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e5c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e5d0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1e5e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1e5f0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1e600 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
1e610 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1e620 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1e630 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
1e640 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e650 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1e660 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1e670 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1e680 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
1e690 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
1e6a0 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
1e6b0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1e6c0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
1e6d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e6e0 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
1e6f0 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
1e700 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
1e710 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e720 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e730 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
1e740 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  get);.      r1 =
1e750 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e760 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1e770 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1e780 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1e790 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1e7a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
1e7b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1e7c0 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b  dOp1(v, op, r1);
1e7d0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1e7e0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1e7f0 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
1e800 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1e810 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
1e820 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e830 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e840 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67  Integer, 0, targ
1e850 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
1e860 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1e870 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62  , addr);.      b
1e880 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e890 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1e8a0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
1e8b0 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
1e8c0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
1e8d0 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
1e8e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1e8f0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1e900 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e910 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1e920 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1e930 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
1e940 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
1e950 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72  te: %s()", pExpr
1e960 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1e970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e980 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d    inReg = pInfo-
1e990 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
1e9a0 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
1e9b0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1e9c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e9d0 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
1e9e0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
1e9f0 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
1ea00 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
1ea10 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1ea20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20   int nFarg;     
1ea30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ea40 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
1ea50 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1ea60 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
1ea70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1ea80 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
1ea90 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  on object */.   
1eaa0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1eab0 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
1eac0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
1ead0 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73  /.      u32 cons
1eae0 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f  tMask = 0;     /
1eaf0 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69  * Mask of functi
1eb00 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  on arguments tha
1eb10 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a  t are constant *
1eb20 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb40 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1eb50 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
1eb60 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
1eb70 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
1eb80 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
1eb90 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
1eba0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
1ebb0 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
1ebc0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1ebd0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
1ebe0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1ebf0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1ec00 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
1ec10 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1ec20 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ec30 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
1ec40 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30         pFarg = 0
1ec50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ec60 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70         pFarg = p
1ec70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1ec80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61       }.      nFa
1ec90 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61  rg = pFarg ? pFa
1eca0 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  rg->nExpr : 0;. 
1ecb0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1ecc0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ecd0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1ece0 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  ) );.      zId =
1ecf0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1ed00 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
1ed10 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1ed20 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72  on(db, zId, nFar
1ed30 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64  g, enc, 0);.#ifd
1ed40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1ed50 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e  _UNKNOWN_SQL_FUN
1ed60 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20  CTION.      if( 
1ed70 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73  pDef==0 && pPars
1ed80 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
1ed90 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
1eda0 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
1edb0 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20  (db, "unknown", 
1edc0 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
1edd0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1ede0 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
1edf0 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c   || pDef->xFinal
1ee00 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize!=0 ){.      
1ee10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1ee20 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
1ee30 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28  wn function: %s(
1ee40 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  )", zId);.      
1ee50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1ee60 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d  ..      /* Attem
1ee70 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c  pt a direct impl
1ee80 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1ee90 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45  e built-in COALE
1eea0 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20  SCE() and.      
1eeb0 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63  ** IFNULL() func
1eec0 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f  tions.  This avo
1eed0 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20  ids unnecessary 
1eee0 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20  evaluation of.  
1eef0 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73      ** arguments
1ef00 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20   past the first 
1ef10 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
1ef20 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1ef30 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
1ef40 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1ef50 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a  UNC_COALESCE ){.
1ef60 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43          int endC
1ef70 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65  oalesce = sqlite
1ef80 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1ef90 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1efa0 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20  t( nFarg>=2 );. 
1efb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1efc0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1efd0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1efe0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1eff0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46     for(i=1; i<nF
1f000 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
1f010 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f020 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
1f030 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e  Null, target, en
1f040 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
1f050 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1f060 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
1f070 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f080 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
1f090 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20  target, 1);.    
1f0a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f0b0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1f0c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1f0d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1f0e0 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
1f0f0 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1f100 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1f110 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1f120 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
1f130 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1f140 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1f150 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63  el(v, endCoalesc
1f160 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
1f170 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1f180 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c    /* The UNLIKEL
1f190 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  Y() function is 
1f1a0 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65  a no-op.  The re
1f1b0 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75  sult is the valu
1f1c0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  e.      ** of th
1f1d0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1f1e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1f1f0 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
1f200 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
1f210 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20  NC_UNLIKELY ){. 
1f220 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1f230 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20  Farg>=1 );.     
1f240 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1f250 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1f260 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
1f270 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
1f280 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
1f290 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
1f2a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
1f2b0 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
1f2c0 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73     if( i<32 && s
1f2d0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1f2e0 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d  tant(pFarg->a[i]
1f2f0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
1f300 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1f310 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
1f320 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d    constMask |= M
1f330 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20  ASKBIT32(i);.   
1f340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1f350 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
1f360 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
1f370 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
1f380 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
1f390 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1f3a0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1f3b0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
1f3c0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
1f3d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f3e0 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29       if( pFarg )
1f3f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
1f400 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20  nstMask ){.     
1f410 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65       r1 = pParse
1f420 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
1f430 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1f440 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20   += nFarg;.     
1f450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f460 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f470 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
1f480 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20  rse, nFarg);.   
1f490 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1f4a0 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20  /* For length() 
1f4b0 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e  and typeof() fun
1f4c0 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f  ctions with a co
1f4d0 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20  lumn argument,. 
1f4e0 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68         ** set th
1f4f0 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74  e P5 parameter t
1f500 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  o the OP_Column 
1f510 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47  opcode to OPFLAG
1f520 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20  _LENGTHARG.     
1f530 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f     ** or OPFLAG_
1f540 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63  TYPEOFARG respec
1f550 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64  tively, to avoid
1f560 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74   unnecessary dat
1f570 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61  a.        ** loa
1f580 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ding..        */
1f590 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
1f5a0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1f5b0 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e  (SQLITE_FUNC_LEN
1f5c0 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  GTH|SQLITE_FUNC_
1f5d0 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20  TYPEOF))!=0 ){. 
1f5e0 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72           u8 expr
1f5f0 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  Op;.          as
1f600 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
1f610 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1f620 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rt( pFarg->a[0].
1f630 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
1f640 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70        exprOp = p
1f650 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1f660 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  ->op;.          
1f670 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43  if( exprOp==TK_C
1f680 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d  OLUMN || exprOp=
1f690 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
1f6a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
1f6b0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
1f6c0 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47  C_LENGTH==OPFLAG
1f6d0 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
1f6e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1f6f0 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  ( SQLITE_FUNC_TY
1f700 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50  PEOF==OPFLAG_TYP
1f710 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20  EOFARG );.      
1f720 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f730 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1f740 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  & OPFLAG_LENGTHA
1f750 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
1f760 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45    pFarg->a[0].pE
1f770 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20  xpr->op2 = .    
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
1f790 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1f7a0 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  (OPFLAG_LENGTHAR
1f7b0 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  G|OPFLAG_TYPEOFA
1f7c0 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  RG);.          }
1f7d0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1f7e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f7f0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1f800 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20  ;     /* Ticket 
1f810 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
1f820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1f830 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1f840 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72  pParse, pFarg, r
1f850 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f870 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
1f880 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45  L_DUP|SQLITE_ECE
1f890 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20  L_FACTOR);.     
1f8a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f8b0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20  chePop(pParse); 
1f8c0 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
1f8d0 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
1f8e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f8f0 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20      r1 = 0;.    
1f900 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1f910 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1f920 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ABLE.      /* Po
1f930 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20  ssibly overload 
1f940 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  the function if 
1f950 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1f960 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  nt is.      ** a
1f970 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
1f980 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  olumn..      **.
1f990 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66        ** For inf
1f9a0 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49  ix functions (LI
1f9b0 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50  KE, GLOB, REGEXP
1f9c0 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65  , and MATCH) use
1f9d0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
1f9e0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e  cond argument, n
1f9f0 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73  ot the first, as
1fa00 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
1fa10 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a   test to.      *
1fa20 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61  * see if it is a
1fa30 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72   column in a vir
1fa40 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69  tual table.  Thi
1fa50 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73  s is done becaus
1fa60 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  e.      ** the l
1fa70 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69  eft operand of i
1fa80 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
1fa90 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77  the operand we w
1faa0 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ant to.      ** 
1fab0 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64  control overload
1fac0 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20  ing) ends up as 
1fad0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1fae0 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ent to the.     
1faf0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54   ** function.  T
1fb00 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41  he expression "A
1fb10 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69   glob B" is equi
1fb20 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20  valent to .     
1fb30 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20   ** "glob(B,A). 
1fb40 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20   We want to use 
1fb50 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62  the A in "A glob
1fb60 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20   B" to test.    
1fb70 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f    ** for functio
1fb80 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20  n overloading.  
1fb90 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42  But we use the B
1fba0 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42   term in "glob(B
1fbb0 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ,A)"..      */. 
1fbc0 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d       if( nFarg>=
1fbd0 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61  2 && (pExpr->fla
1fbe0 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e  gs & EP_InfixFun
1fbf0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  c) ){.        pD
1fc00 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
1fc10 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
1fc20 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
1fc30 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45  , pFarg->a[1].pE
1fc40 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
1fc50 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b  e if( nFarg>0 ){
1fc60 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
1fc70 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
1fc80 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
1fc90 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
1fca0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
1fcb0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1fcc0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
1fcd0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1fce0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
1fcf0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1fd00 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
1fd10 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20   db->pDfltColl; 
1fd20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fd30 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1fd40 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
1fd50 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
1fd60 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1fd70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1fd80 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1fd90 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20  , OP_Function0, 
1fda0 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
1fdb0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1fdd0 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
1fde0 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
1fdf0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1fe00 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
1fe10 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  ;.      if( nFar
1fe20 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d  g && constMask==
1fe30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1fe40 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1fe50 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
1fe60 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d   nFarg);.      }
1fe70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fe80 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1fe90 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1fea0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
1feb0 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
1fec0 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
1fed0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
1fee0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fef0 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
1ff00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ff10 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
1ff20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45     if( op==TK_SE
1ff30 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20  LECT && (nCol = 
1ff40 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1ff50 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
1ff60 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
1ff70 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
1ff80 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f  rror(pParse, nCo
1ff90 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 1);.      }el
1ffa0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  se{.        inRe
1ffb0 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  g = sqlite3CodeS
1ffc0 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
1ffd0 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20   pExpr, 0, 0);. 
1ffe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1fff0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20000 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  se TK_SELECT_COL
20010 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
20020 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
20030 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
20040 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
20050 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  ->iTable = sqlit
20060 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
20070 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20080 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Left, 0, 0);.   
20090 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
200a0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d   = pExpr->pLeft-
200b0 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d  >iTable + pExpr-
200c0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
200d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
200e0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
200f0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
20100 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
20110 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
20120 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
20130 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
20140 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
20150 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20160 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
20170 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
20180 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20190 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
201a0 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
201b0 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
201c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
201d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
201e0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
201f0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
20200 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
20210 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
20220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20230 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20240 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
20250 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
20260 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
20270 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
20280 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20290 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
202a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
202b0 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
202c0 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
202d0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
202e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
202f0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
20300 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
20310 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
20320 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
20330 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
20340 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
20350 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
20360 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
20370 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
20380 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
20390 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
203a0 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
203b0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
203c0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65  TWEEN: {.      e
203d0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
203e0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
203f0 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rget, 0, 0);.   
20400 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20410 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
20420 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
20430 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65  LLATE: .    case
20440 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
20450 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
20460 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
20470 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
20480 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
20490 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
204a0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
204b0 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
204c0 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
204d0 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
204e0 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
204f0 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
20500 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
20510 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
20520 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
20530 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
20540 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
20550 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
20560 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
20570 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
20580 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
20590 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
205a0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
205b0 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
205c0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
205d0 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
205e0 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
205f0 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
20600 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
20610 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
20620 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
20630 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
20640 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
20650 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73    ** The express
20660 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
20670 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50  ed using an OP_P
20680 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65  aram opcode. The
20690 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72   p1.      ** par
206a0 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
206b0 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f   0 for an old.ro
206c0 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f  wid reference, o
206d0 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20  r to (i+1).     
206e0 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65   ** to reference
206f0 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20   another column 
20700 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  of the old.* pse
20710 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65  udo-table, where
20720 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20   .      ** i is 
20730 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
20740 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e   column. For a n
20750 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ew.rowid referen
20760 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20  ce, p1 is.      
20770 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c  ** set to (n+1),
20780 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20   where n is the 
20790 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
207a0 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f  s in each pseudo
207b0 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  -table..      **
207c0 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65   For a reference
207d0 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   to any other co
207e0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
207f0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
20800 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  p1.      ** is s
20810 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77  et to (n+2+i), w
20820 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65  here n and i are
20830 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76   as defined prev
20840 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20  iously. For.    
20850 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66    ** example, if
20860 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68   the table on wh
20870 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65  ich triggers are
20880 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a   being fired is.
20890 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65        ** declare
208a0 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
208b0 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
208c0 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
208d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
208e0 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e  ** Then p1 is in
208f0 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
20900 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
20910 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20       **   p1==0 
20920 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69    ->    old.rowi
20930 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e  d     p1==3   ->
20940 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20      new.rowid.  
20950 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20      **   p1==1  
20960 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20   ->    old.a    
20970 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20       p1==4   -> 
20980 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a     new.a.      *
20990 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20  *   p1==2   ->  
209a0 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20    old.b         
209b0 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65  p1==5   ->    ne
209c0 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20  w.b       .     
209d0 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
209e0 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  *pTab = pExpr->p
209f0 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  Tab;.      int p
20a00 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  1 = pExpr->iTabl
20a10 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b  e * (pTab->nCol+
20a20 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e  1) + 1 + pExpr->
20a30 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20  iColumn;..      
20a40 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
20a50 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70  Table==0 || pExp
20a60 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  r->iTable==1 );.
20a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
20a80 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31  xpr->iColumn>=-1
20a90 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
20aa0 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  mn<pTab->nCol );
20ab0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20ac0 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20  Tab->iPKey<0 || 
20ad0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
20ae0 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20  pTab->iPKey );. 
20af0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e       assert( p1>
20b00 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e  =0 && p1<(pTab->
20b10 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20  nCol*2+2) );..  
20b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20b30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61  ddOp2(v, OP_Para
20b40 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a  m, p1, target);.
20b50 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
20b60 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20  t((v, "%s.%s -> 
20b70 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70  $%d",.        (p
20b80 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
20b90 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
20ba0 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
20bb0 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
20bc0 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62  d" : pExpr->pTab
20bd0 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
20be0 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20  olumn].zName),. 
20bf0 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20         target.  
20c00 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66      ));..#ifndef
20c10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
20c20 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
20c30 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
20c40 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  mn has REAL affi
20c50 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72  nity, it may cur
20c60 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
20c70 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
20c80 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f  integer. Use OP_
20c90 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20  RealAffinity to 
20ca0 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
20cb0 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20  really real..   
20cc0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
20cd0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30  VIDENCE-OF: R-60
20ce0 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65  985-57662 SQLite
20cf0 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
20d00 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a  e value back to.
20d10 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e        ** floatin
20d20 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74  g point when ext
20d30 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20  racting it from 
20d40 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  the record.  */.
20d50 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
20d60 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20  >iColumn>=0 .   
20d70 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f      && pTab->aCo
20d80 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
20d90 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
20da0 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20  TE_AFF_REAL.    
20db0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
20dc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
20dd0 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
20de0 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  y, target);.    
20df0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
20e00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
20e10 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f     case TK_VECTO
20e20 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
20e30 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20e40 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69  e, "row value mi
20e50 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62  sused");.      b
20e60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
20e70 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
20e80 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
20e90 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
20ea0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
20eb0 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
20ec0 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
20ed0 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
20ee0 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
20ef0 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
20f00 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
20f10 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
20f20 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
20f30 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
20f40 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
20f50 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
20f60 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
20f70 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
20f80 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
20f90 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
20fa0 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
20fb0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
20fc0 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
20fd0 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
20fe0 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
20ff0 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
21000 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
21010 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
21020 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61  * Y is in the la
21030 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45  st element of pE
21040 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20  xpr->x.pList if 
21050 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
21060 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20  nExpr is.    ** 
21070 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61  odd.  The Y is a
21080 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49  lso optional.  I
21090 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
210a0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c  elements in x.pL
210b0 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76  ist.    ** is ev
210c0 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d  en, then Y is om
210d0 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f  itted and the "o
210e0 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74  therwise" result
210f0 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
21100 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
21110 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
21120 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
21130 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
21140 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
21150 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
21160 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
21170 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
21180 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
21190 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
211a0 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
211b0 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
211c0 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
211d0 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
211e0 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
211f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
21200 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70  ault: assert( op
21210 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20  ==TK_CASE ); {. 
21220 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
21230 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
21240 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
21250 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
21260 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
21270 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21290 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
212a0 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
212b0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
212c0 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
212f0 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
21300 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21320 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
21330 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
21340 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
21350 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
21360 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
21370 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
21380 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
21390 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
213a0 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
213b0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
213c0 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
213d0 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
213e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
213f0 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
21400 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
21410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21430 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
21440 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
21450 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
21460 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
21470 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
21480 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
21490 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
214a0 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
214b0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
214c0 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
214d0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
214e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
214f0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
21500 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
21510 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
21520 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
21530 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
21540 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
21550 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
21560 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
21570 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
21580 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
21590 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
215a0 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
215b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
215c0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
215d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
215e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d  0 ){.        tem
215f0 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  pX = *pX;.      
21600 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
21610 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
21620 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52  .        exprToR
21630 65 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20  egister(&tempX, 
21640 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70  exprCodeVector(p
21650 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
21660 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20  regFree1));.    
21670 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
21680 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
21690 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43       memset(&opC
216a0 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f  ompare, 0, sizeo
216b0 66 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20  f(opCompare));. 
216c0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
216d0 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20  .op = TK_EQ;.   
216e0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
216f0 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20  Left = &tempX;. 
21700 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26         pTest = &
21710 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  opCompare;.     
21720 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35     /* Ticket b35
21730 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64  1d95f9cd5ef17e9d
21740 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31  9dbae18f5ca86111
21750 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a  90001:.        *
21760 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72  * The value in r
21770 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65  egFree1 might ge
21780 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20  t SCopy-ed into 
21790 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e  the file result.
217a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d  .        ** So m
217b0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
217c0 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73  e regFree1 regis
217d0 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65  ter is not reuse
217e0 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20  d for other.    
217f0 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20      ** purposes 
21800 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65  and possibly ove
21810 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20  rwritten.  */.  
21820 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
21830 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
21840 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
21850 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  pr-1; i=i+2){.  
21860 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21870 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
21880 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
21890 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
218a0 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
218b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
218c0 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
218d0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
218e0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
218f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
21900 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
21910 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
21920 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
21930 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
21940 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
21950 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
21960 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
21970 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
21980 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
21990 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
219a0 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
219b0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
219c0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
219d0 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
219e0 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
219f0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
21a00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
21a10 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
21a20 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
21a30 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21a40 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
21a50 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  o(v, endLabel);.
21a60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21a70 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
21a80 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
21a90 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
21aa0 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
21ab0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21ac0 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d   if( (nExpr&1)!=
21ad0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
21ae0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
21af0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
21b00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
21b10 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  de(pParse, pELis
21b20 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45  t->a[nExpr-1].pE
21b30 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
21b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21b50 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
21b60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
21b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21b80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21b90 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
21ba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21bb0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
21bc0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
21bd0 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20  se->nErr>0 .    
21be0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
21bf0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69  ->iCacheLevel==i
21c00 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20  CacheLevel );.  
21c10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21c20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
21c30 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
21c40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
21c50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21c60 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
21c70 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
21c80 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
21c90 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
21ca0 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20  Rollback .      
21cb0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
21cc0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
21cd0 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  t.           || 
21ce0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
21cf0 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20  =OE_Fail.       
21d00 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
21d10 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
21d20 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
21d30 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54   if( !pParse->pT
21d40 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20  riggerTab ){.   
21d50 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
21d60 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
21d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d80 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
21d90 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
21da0 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
21db0 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
21dc0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
21dd0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
21de0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
21df0 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
21e00 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
21e10 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
21e20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
21e30 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
21e40 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
21e50 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
21e60 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
21e70 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  ity==OE_Ignore )
21e80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21e90 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
21ea0 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48           v, OP_H
21eb0 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  alt, SQLITE_OK, 
21ec0 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45  OE_Ignore, 0, pE
21ed0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29  xpr->u.zToken,0)
21ee0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
21ef0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
21f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21f10 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
21f20 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51  raint(pParse, SQ
21f30 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
21f40 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20  TRIGGER,.       
21f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f60 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
21f70 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75  finity, pExpr->u
21f80 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a  .zToken, 0, 0);.
21f90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
21fa0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
21fb0 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
21fc0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
21fd0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
21fe0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
21ff0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
22000 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72  , regFree2);.  r
22010 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
22020 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74  /*.** Factor out
22030 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65   the code of the
22040 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
22050 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  n to initializat
22060 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
22070 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
22080 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65  eAtInit(.  Parse
22090 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
220a0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
220b0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
220c0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ,      /* The ex
220d0 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65  pression to code
220e0 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69   when the VDBE i
220f0 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20  nitializes */.  
22100 69 6e 74 20 72 65 67 44 65 73 74 2c 20 20 20 20  int regDest,    
22110 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76    /* Store the v
22120 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
22130 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  ister */.  u8 re
22140 75 73 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20  usable       /* 
22150 54 72 75 65 20 69 66 20 74 68 69 73 20 65 78 70  True if this exp
22160 72 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61  ression is reusa
22170 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ble */.){.  Expr
22180 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72  List *p;.  asser
22190 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  t( ConstFactorOk
221a0 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20  (pParse) );.  p 
221b0 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  = pParse->pConst
221c0 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20  Expr;.  pExpr = 
221d0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
221e0 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
221f0 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  , 0);.  p = sqli
22200 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
22210 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78  d(pParse, p, pEx
22220 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  pr);.  if( p ){.
22230 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
22240 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
22250 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70   = &p->a[p->nExp
22260 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d  r-1];.     pItem
22270 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
22280 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20  g = regDest;.   
22290 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c    pItem->reusabl
222a0 65 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20  e = reusable;.  
222b0 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  }.  pParse->pCon
222c0 73 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f  stExpr = p;.}../
222d0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
222e0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
222f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
22300 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
22310 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
22320 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
22330 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
22340 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
22350 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
22360 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
22370 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
22380 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
22390 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
223a0 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
223b0 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
223c0 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
223d0 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
223e0 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
223f0 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
22400 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
22410 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
22420 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
22430 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
22440 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
22450 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
22460 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
22470 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
22480 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
22490 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
224a0 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
224b0 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
224c0 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
224d0 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
224e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
224f0 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
22500 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
22510 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
22520 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
22530 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
22540 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
22550 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73  xpr);.  if( Cons
22560 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
22570 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f  ).   && pExpr->o
22580 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  p!=TK_REGISTER. 
22590 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
225a0 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
225b0 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20  n(pExpr).  ){.  
225c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20    ExprList *p = 
225d0 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
225e0 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  pr;.    int i;. 
225f0 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20     *pReg  = 0;. 
22600 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
22610 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
22620 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
22630 20 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70       for(pItem=p
22640 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b  ->a, i=p->nExpr;
22650 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69   i>0; pItem++, i
22660 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  --){.        if(
22670 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
22680 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
22690 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
226a0 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30  xpr,pExpr,-1)==0
226b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
226c0 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43  turn pItem->u.iC
226d0 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20  onstExprReg;.   
226e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
226f0 20 20 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b     }.    r2 = ++
22700 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
22710 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
22720 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
22730 70 45 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20  pExpr, r2, 1);. 
22740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
22750 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
22760 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
22770 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
22780 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
22790 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
227a0 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72  );.    if( r2==r
227b0 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67  1 ){.      *pReg
227c0 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = r1;.    }else
227d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
227e0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
227f0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
22800 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20   *pReg = 0;.    
22810 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
22820 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
22830 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
22840 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
22850 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
22860 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
22870 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
22880 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
22890 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
228a0 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
228b0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
228c0 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  target..*/.void 
228d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
228e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
228f0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
22900 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
22910 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
22920 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
22930 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
22940 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  m );.  if( pExpr
22950 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   && pExpr->op==T
22960 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
22970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22980 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
22990 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70  e, OP_Copy, pExp
229a0 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
229b0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
229c0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
229d0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
229e0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
229f0 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72  rget);.    asser
22a00 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
22a10 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
22a20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
22a30 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67  );.    if( inReg
22a40 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72  !=target && pPar
22a50 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
22a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22a70 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
22a80 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  be, OP_SCopy, in
22a90 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
22aa0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
22ab0 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e   Make a transien
22ac0 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  t copy of expres
22ad0 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74  sion pExpr and t
22ae0 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e  hen code it usin
22af0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72  g.** sqlite3Expr
22b00 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f  Code().  This ro
22b10 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74  utine works just
22b20 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
22b30 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70  rCode().** excep
22b40 74 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74  t that the input
22b50 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67   expression is g
22b60 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
22b70 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
22b80 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
22b90 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50  deCopy(Parse *pP
22ba0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
22bb0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
22bc0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
22bd0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45  pParse->db;.  pE
22be0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
22bf0 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
22c00 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  0);.  if( !db->m
22c10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71  allocFailed ) sq
22c20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
22c30 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
22c40 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  get);.  sqlite3E
22c50 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
22c60 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  xpr);.}../*.** G
22c70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
22c80 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
22c90 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
22ca0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
22cb0 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
22cc0 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
22cd0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
22ce0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
22cf0 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
22d00 65 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74  er target.  If t
22d10 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
22d20 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
22d30 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
22d40 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20  might choose to 
22d50 63 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73  code the express
22d60 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a  ion at initializ
22d70 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76  ation time..*/.v
22d80 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
22d90 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61  odeFactorable(Pa
22da0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
22db0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
22dc0 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61  rget){.  if( pPa
22dd0 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
22de0 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  or && sqlite3Exp
22df0 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  rIsConstant(pExp
22e00 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
22e10 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
22e20 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
22e30 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c  arget, 0);.  }el
22e40 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
22e50 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
22e60 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
22e70 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
22e80 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
22e90 65 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69  evaluates the gi
22ea0 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
22eb0 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75  nd puts the resu
22ec0 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  lt.** in registe
22ed0 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  r target..**.** 
22ee0 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  Also make a copy
22ef0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
22f00 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  on results into 
22f10 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20  another "cache" 
22f20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
22f30 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65  modify the expre
22f40 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ssion so that th
22f50 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69  e next time it i
22f60 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20  s evaluated,.** 
22f70 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  the result is a 
22f80 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68  copy of the cach
22f90 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  e register..**.*
22fa0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
22fb0 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
22fc0 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
22fd0 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  used multiple .*
22fe0 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61  * times.  They a
22ff0 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  re evaluated onc
23000 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
23010 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  s of the express
23020 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65  ion.** are reuse
23030 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
23040 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
23050 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
23060 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
23070 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
23080 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
23090 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65  pVdbe;.  int iMe
230a0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  m;..  assert( ta
230b0 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
230c0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
230d0 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
230e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
230f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
23100 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d  arget);.  iMem =
23110 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
23120 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
23130 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
23140 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a   target, iMem);.
23150 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
23160 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d  (pExpr, iMem);.}
23170 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
23180 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
23190 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
231a0 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
231b0 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
231c0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
231d0 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
231e0 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
231f0 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
23200 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
23210 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
23220 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a  ts evaluated..**
23230 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
23240 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65  CEL_DUP flag pre
23250 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65  vents the argume
23260 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  nts from being.*
23270 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f  * filled using O
23280 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70  P_SCopy.  OP_Cop
23290 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69  y must be used i
232a0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstead..**.** Th
232b0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  e SQLITE_ECEL_FA
232c0 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c  CTOR argument al
232d0 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72  lows constant ar
232e0 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a  guments to be.**
232f0 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e   factored out in
23300 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
23310 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n code..**.** Th
23320 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  e SQLITE_ECEL_RE
23330 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  F flag means tha
23340 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  t expressions in
23350 20 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a   the list with.*
23360 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75  * ExprList.a[].u
23370 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
23380 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
23390 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  en evaluated and
233a0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65   stored.** in re
233b0 67 69 73 74 65 72 73 20 61 74 20 73 72 63 52 65  gisters at srcRe
233c0 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61  g, and so the va
233d0 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65  lue can be copie
233e0 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f  d from there..*/
233f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
23400 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
23410 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
23420 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
23430 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
23440 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
23450 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
23460 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
23470 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
23480 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
23490 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
234a0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52  ts */.  int srcR
234b0 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  eg,        /* So
234c0 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69  urce registers i
234d0 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  f SQLITE_ECEL_RE
234e0 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20  F */.  u8 flags 
234f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
23500 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73  ITE_ECEL_* flags
23510 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
23520 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
23530 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Item;.  int i, j
23540 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70  , n;.  u8 copyOp
23550 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
23560 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f  TE_ECEL_DUP) ? O
23570 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
23580 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  y;.  Vdbe *v = p
23590 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
235a0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
235b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
235c0 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
235d0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
235e0 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
235f0 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
23600 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
23610 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
23620 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63  .  if( !ConstFac
23630 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20  torOk(pParse) ) 
23640 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
23650 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20  _ECEL_FACTOR;.  
23660 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
23670 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
23680 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
23690 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
236a0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
236b0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
236c0 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d  LITE_ECEL_REF)!=
236d0 30 20 26 26 20 28 6a 20 3d 20 70 4c 69 73 74 2d  0 && (j = pList-
236e0 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
236f0 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20  ByCol)>0 ){.    
23700 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23710 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a  Op2(v, copyOp, j
23720 2b 73 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65  +srcReg-1, targe
23730 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t+i);.    }else 
23740 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
23750 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
23760 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45 78  !=0 && sqlite3Ex
23770 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78  prIsConstant(pEx
23780 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
23790 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
237a0 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
237b0 2c 20 74 61 72 67 65 74 2b 69 2c 20 30 29 3b 0a  , target+i, 0);.
237c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
237d0 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c   int inReg = sql
237e0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
237f0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
23800 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
23810 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
23820 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20  rget+i ){.      
23830 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
23840 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f         if( copyO
23850 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20  p==OP_Copy.     
23860 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69      && (pOp=sqli
23870 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
23880 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  -1))->opcode==OP
23890 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
238a0 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  & pOp->p1+pOp->p
238b0 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20  3+1==inReg.     
238c0 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70      && pOp->p2+p
238d0 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74  Op->p3+1==target
238e0 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  +i.        ){.  
238f0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b          pOp->p3+
23900 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
23910 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
23920 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23930 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20   copyOp, inReg, 
23940 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
23950 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
23960 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23970 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
23980 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
23990 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
239a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54  ..**.**    x BET
239b0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a  WEEN y AND z.**.
239c0 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
239d0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a  equivalent to .*
239e0 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44  *.**    x>=y AND
239f0 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65   x<=z.**.** Code
23a00 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
23a10 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
23a20 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
23a30 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69  ression.** elimi
23a40 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a  nation of x..**.
23a50 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70  ** The xJumpIf p
23a60 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
23a70 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a  nes details:.**.
23a80 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20  **    NULL:     
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
23aa0 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20  ore the boolean 
23ab0 72 65 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65  result in reg[de
23ac0 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  st].**    sqlite
23ad0 33 45 78 70 72 49 66 54 72 75 65 3a 20 20 20 20  3ExprIfTrue:    
23ae0 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69    Jump to dest i
23af0 66 20 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c  f true.**    sql
23b00 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a  ite3ExprIfFalse:
23b10 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73       Jump to des
23b20 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a  t if false.**.**
23b30 20 54 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   The jumpIfNull 
23b40 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
23b50 6f 72 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20  ored if xJumpIf 
23b60 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  is NULL..*/.stat
23b70 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65  ic void exprCode
23b80 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65  Between(.  Parse
23b90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
23ba0 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
23bb0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
23bc0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
23bd0 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
23be0 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73  e BETWEEN expres
23bf0 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
23c00 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
23c10 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
23c20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74  or storage locat
23c30 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ion */.  void (*
23c40 78 4a 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78  xJump)(Parse*,Ex
23c50 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a  pr*,int,int), /*
23c60 20 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20   Action to take 
23c70 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
23c80 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74  ull    /* Take t
23c90 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
23ca0 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a  ETWEEN is NULL *
23cb0 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41  /.){. Expr exprA
23cc0 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41  nd;     /* The A
23cd0 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20  ND operator in  
23ce0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a  x>=y AND x<=z  *
23cf0 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66  /.  Expr compLef
23d00 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e  t;    /* The  x>
23d10 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =y  term */.  Ex
23d20 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20  pr compRight;   
23d30 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65  /* The  x<=z  te
23d40 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70  rm */.  Expr exp
23d50 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rX;       /* The
23d60 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69    x  subexpressi
23d70 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  on */.  int regF
23d80 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d  ree1 = 0; /* Tem
23d90 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
23da0 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65  ter */...  memse
23db0 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20  t(&compLeft, 0, 
23dc0 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
23dd0 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67   memset(&compRig
23de0 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ht, 0, sizeof(Ex
23df0 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
23e00 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65  exprAnd, 0, size
23e10 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73  of(Expr));..  as
23e20 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
23e30 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
23e40 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
23e50 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
23e60 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  >pLeft;.  exprAn
23e70 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
23e80 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
23e90 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
23ea0 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
23eb0 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d  compRight;.  com
23ec0 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
23ed0 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65  ;.  compLeft.pLe
23ee0 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
23ef0 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
23f00 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
23f10 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63  >a[0].pExpr;.  c
23f20 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
23f30 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  _LE;.  compRight
23f40 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
23f50 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69  .  compRight.pRi
23f60 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
23f70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
23f80 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
23f90 65 72 28 26 65 78 70 72 58 2c 20 65 78 70 72 43  er(&exprX, exprC
23fa0 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65  odeVector(pParse
23fb0 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
23fc0 65 65 31 29 29 3b 0a 20 20 69 66 28 20 78 4a 75  ee1));.  if( xJu
23fd0 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28  mp ){.    xJump(
23fe0 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
23ff0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
24000 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
24010 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d    exprX.flags |=
24020 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20   EP_FromJoin;.  
24030 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24040 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
24050 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b  &exprAnd, dest);
24060 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
24070 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
24080 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
24090 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
240a0 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
240b0 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
240c0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
240d0 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
240e0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
240f0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
24100 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
24110 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
24120 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
24130 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
24140 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
24150 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
24160 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
24170 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
24180 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
24190 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
241a0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
241b0 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
241c0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
241d0 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
241e0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
241f0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
24200 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
24210 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
24220 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
24230 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
24240 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
24250 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
24260 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
24270 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
24280 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
24290 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
242a0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
242b0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
242c0 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
242d0 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
242e0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
242f0 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
24300 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
24310 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
24320 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
24330 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
24340 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
24350 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
24360 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
24370 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
24380 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
24390 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
243a0 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
243b0 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
243c0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
243d0 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
243e0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
243f0 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
24400 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
24410 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
24420 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
24430 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
24440 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45  l flag is SQLITE
24450 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a  _JUMPIFNULL..**.
24460 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
24470 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
24480 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
24490 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
244a0 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
244b0 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
244c0 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
244d0 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
244e0 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
244f0 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
24500 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
24510 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
24520 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
24530 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
24540 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
24550 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
24560 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
24570 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
24580 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
24590 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
245a0 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
245b0 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
245c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
245d0 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
245e0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
245f0 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
24600 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
24610 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
24620 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
24630 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
24640 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
24650 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
24660 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
24670 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
24680 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
24690 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
246a0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
246b0 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
246c0 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
246d0 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
246e0 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
246f0 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ler */.  if( NEV
24700 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72  ER(pExpr==0) ) r
24710 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61  eturn;  /* No wa
24720 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
24730 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70  n */.  op = pExp
24740 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
24750 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
24760 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
24770 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
24780 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
24790 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
247a0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
247b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
247c0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
247d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
247e0 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e  , d2,jumpIfNull^
247f0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
24800 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
24810 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
24820 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
24830 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
24840 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
24850 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
24860 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
24870 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
24880 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
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 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
248b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
248c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
248d0 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_OR: {.      te
248e0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
248f0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
24900 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
24910 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
24920 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
24930 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
24940 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
24950 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
24960 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
24970 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
24980 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
24990 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
249a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
249b0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
249c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
249d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
249e0 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
249f0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
24a00 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
24a10 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
24a20 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
24a30 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
24a40 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
24a50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
24a60 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
24a70 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
24a80 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
24a90 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
24aa0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
24ab0 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
24ac0 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
24ad0 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
24ae0 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_NE;.      jum
24af0 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
24b00 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
24b10 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
24b20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
24b30 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
24b40 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
24b50 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
24b60 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
24b70 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
24b80 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
24b90 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
24ba0 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
24bb0 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
24bc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
24bd0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
24be0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
24bf0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
24c00 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
24c10 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
24c20 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
24c30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
24c40 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
24c50 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
24c60 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
24c70 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
24c80 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
24c90 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
24ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24cb0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
24cc0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
24cd0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
24ce0 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
24cf0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
24d00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
24d10 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
24d20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
24d30 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
24d40 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
24d50 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
24d60 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
24d70 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
24d80 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
24d90 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
24da0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
24db0 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
24dc0 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
24dd0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
24de0 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
24df0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
24e00 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
24e10 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
24e20 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
24e30 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
24e40 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
24e50 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
24e60 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
24e70 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
24e80 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
24e90 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
24ea0 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
24eb0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
24ec0 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
24ed0 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
24ee0 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
24ef0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
24f00 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
24f10 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
24f20 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
24f30 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
24f40 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
24f50 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
24f60 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
24f70 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
24f80 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
24f90 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
24fa0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
24fb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
24fc0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
24fd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
24fe0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
24ff0 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
25000 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
25010 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
25020 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
25030 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
25040 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
25050 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
25060 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
25070 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
25080 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
25090 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
250a0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
250b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
250c0 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
250d0 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
250e0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
250f0 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
25100 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
25110 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
25120 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
25130 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
25140 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
25150 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
25160 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
25170 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
25180 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
25190 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
251a0 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
251b0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
251c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
251d0 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
251e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
251f0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
25200 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
25210 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
25220 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
25230 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
25240 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
25250 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
25260 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
25270 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
25280 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
25290 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
252a0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
252b0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
252c0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
252d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
252e0 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
252f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
25300 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
25310 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
25320 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
25330 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
25340 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f  : {.    default_
25350 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20  expr:.      if( 
25360 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
25370 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
25380 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
25390 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
253a0 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
253b0 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
253c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
253d0 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  No-op */.      }
253e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
253f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
25400 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
25410 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
25420 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
25430 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
25440 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
25450 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
25460 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
25470 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
25480 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
25490 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
254a0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
254b0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
254c0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
254d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
254e0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
254f0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
25500 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
25510 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
25520 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
25530 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
25540 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
25550 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
25560 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
25570 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
25580 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
25590 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
255a0 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
255b0 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
255c0 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
255d0 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
255e0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
255f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
25600 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
25610 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
25620 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
25630 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
25640 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
25650 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
25660 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
25670 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
25680 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
25690 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
256a0 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
256b0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
256c0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
256d0 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
256e0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
256f0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
25700 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
25710 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
25720 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
25730 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
25740 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
25750 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
25760 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
25770 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
25780 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
25790 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65  eturn; /* Existe
257a0 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
257b0 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
257c0 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
257d0 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
257e0 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
257f0 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
25800 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
25810 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
25820 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
25830 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
25840 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
25850 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
25860 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
25870 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
25880 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
25890 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
258a0 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
258b0 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
258c0 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
258d0 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
258e0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
258f0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
25900 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
25910 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
25920 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
25930 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
25940 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
25950 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
25960 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
25970 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
25980 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
25990 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
259a0 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
259b0 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
259c0 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
259d0 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
259e0 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
259f0 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
25a00 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
25a10 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
25a20 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
25a30 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
25a40 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
25a50 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
25a60 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
25a70 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
25a80 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
25a90 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
25aa0 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
25ab0 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
25ac0 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
25ad0 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
25ae0 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
25af0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
25b00 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
25b10 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
25b20 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
25b30 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
25b40 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
25b50 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
25b60 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
25b70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
25b80 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
25b90 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
25ba0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
25bb0 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
25bc0 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
25bd0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
25be0 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
25bf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
25c00 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
25c10 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
25c20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
25c30 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
25c40 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
25c50 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
25c60 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
25c70 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
25c80 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
25c90 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
25ca0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
25cb0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
25cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25cd0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
25ce0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
25cf0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
25d00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25d10 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
25d20 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
25d30 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
25d40 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
25d50 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
25d60 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
25d70 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
25d80 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
25d90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
25da0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
25db0 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
25dc0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
25dd0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
25de0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
25df0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
25e00 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
25e10 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
25e20 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70  >pLeft, d2, jump
25e30 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
25e40 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
25e50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
25e60 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
25e70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25e80 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
25e90 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
25ea0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
25eb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
25ec0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
25ed0 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
25ee0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
25ef0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
25f00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
25f10 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
25f20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
25f30 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
25f40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
25f50 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
25f60 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
25f70 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
25f80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
25f90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
25fa0 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
25fb0 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
25fc0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
25fd0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
25fe0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
25ff0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
26000 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
26010 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
26020 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
26030 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  Q;.      jumpIfN
26040 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
26050 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
26060 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
26070 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
26080 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
26090 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
260a0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
260b0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
260c0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
260d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
260e0 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
260f0 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
26100 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
26110 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26120 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26130 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
26140 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
26150 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
26160 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
26170 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
26180 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
26190 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
261a0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
261b0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
261c0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
261d0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
261e0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
26200 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
26210 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
26220 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
26230 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
26240 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
26250 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
26260 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
26270 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
26280 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
26290 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
262a0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
262b0 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
262c0 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
262d0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
262e0 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
262f0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
26300 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
26310 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
26320 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
26330 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
26340 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
26350 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
26360 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
26370 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
26380 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
26390 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
263a0 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
263b0 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
263c0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
263d0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
263e0 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
263f0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
26400 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
26410 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
26420 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
26430 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
26440 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
26450 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
26460 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
26470 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
26480 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26490 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
264a0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
264b0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
264c0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
264d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
264e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
264f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
26500 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
26510 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
26520 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
26530 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
26540 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
26550 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
26560 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
26570 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
26580 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
26590 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
265a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
265b0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20  p==TK_ISNULL ); 
265c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
265d0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
265e0 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
265f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
26600 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LL );  VdbeCover
26610 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
26620 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
26630 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
26640 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
26650 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26660 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
26670 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
26680 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26690 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
266a0 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
266b0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
266c0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
266d0 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
266e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
266f0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
26700 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
26710 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
26720 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
26730 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
26740 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
26750 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
26760 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
26770 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26780 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
26790 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
267a0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
267b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
267c0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
267d0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
267e0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
267f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
26800 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
26810 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
26820 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
26830 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
26840 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
26850 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20  default_expr: . 
26860 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
26870 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
26880 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26890 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
268a0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
268b0 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
268c0 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
268d0 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
268e0 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
268f0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
26900 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
26910 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
26920 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
26930 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26940 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
26950 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
26960 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
26970 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
26980 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
26990 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
269a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
269b0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
269c0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
269d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
269e0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
269f0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
26a00 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
26a10 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
26a20 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
26a30 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
26a40 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
26a50 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29  te3ExprIfFalse()
26a60 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63   except that a c
26a70 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70  opy is made of p
26a80 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63  Expr before.** c
26a90 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20  ode generation, 
26aa0 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73  and that copy is
26ab0 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63   deleted after c
26ac0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ode generation. 
26ad0 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20  This.** ensures 
26ae0 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
26af0 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61  l pExpr is uncha
26b00 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
26b10 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26b20 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Dup(Parse *pPars
26b30 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
26b40 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d  int dest,int jum
26b50 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69  pIfNull){.  sqli
26b60 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
26b70 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43  ->db;.  Expr *pC
26b80 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
26b90 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
26ba0 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
26bb0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
26bc0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
26bd0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26be0 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d  pCopy, dest, jum
26bf0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
26c00 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
26c10 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a  e(db, pCopy);.}.
26c20 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
26c30 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
26c40 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
26c50 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
26c60 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
26c70 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
26c80 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
26c90 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
26ca0 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
26cb0 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
26cc0 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
26cd0 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
26ce0 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
26cf0 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
26d00 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
26d10 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
26d20 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
26d30 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
26d40 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
26d50 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
26d60 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
26d70 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
26d80 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
26d90 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
26da0 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
26db0 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
26dc0 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
26dd0 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
26de0 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
26df0 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
26e00 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
26e10 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
26e20 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
26e30 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
26e40 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
26e50 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
26e60 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
26e70 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
26e80 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
26e90 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
26ea0 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
26eb0 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
26ec0 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
26ed0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
26ee0 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
26ef0 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
26f00 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
26f10 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
26f20 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
26f30 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
26f40 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
26f50 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
26f60 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
26f70 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
26f80 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
26f90 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
26fa0 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
26fb0 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
26fc0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
26fd0 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
26fe0 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
26ff0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
27000 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
27010 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
27020 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
27030 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
27040 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
27050 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
27060 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
27070 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
27080 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
27090 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
270a0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
270b0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
270c0 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
270d0 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
270e0 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46  .  u32 combinedF
270f0 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d  lags;.  if( pA==
27100 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20  0 || pB==0 ){.  
27110 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20    return pB==pA 
27120 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63  ? 0 : 2;.  }.  c
27130 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70  ombinedFlags = p
27140 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66  A->flags | pB->f
27150 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62  lags;.  if( comb
27160 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49  inedFlags & EP_I
27170 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
27180 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42  f( (pA->flags&pB
27190 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61  ->flags&EP_IntVa
271a0 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75  lue)!=0 && pA->u
271b0 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69  .iValue==pB->u.i
271c0 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72  Value ){.      r
271d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
271e0 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
271f0 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
27200 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  B->op ){.    if(
27210 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
27220 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
27230 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
27240 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32  eft, pB, iTab)<2
27250 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
27260 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
27270 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pB->op==TK_COL
27280 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
27290 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70  xprCompare(pA, p
272a0 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c  B->pLeft, iTab)<
272b0 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
272c0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 1;.    }.    r
272d0 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
272e0 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  f( pA->op!=TK_CO
272f0 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d  LUMN && pA->op!=
27300 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26  TK_AGG_COLUMN &&
27310 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
27320 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
27330 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  =TK_FUNCTION ){.
27340 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
27350 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a  3StrICmp(pA->u.z
27360 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
27370 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  en)!=0 ) return 
27380 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
27390 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54   strcmp(pA->u.zT
273a0 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
273b0 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
273c0 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b  eturn pA->op==TK
273d0 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32  _COLLATE ? 1 : 2
273e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
273f0 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
27400 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
27410 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
27420 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
27430 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  2;.  if( ALWAYS(
27440 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
27450 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d   EP_TokenOnly)==
27460 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  0) ){.    if( co
27470 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
27480 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74  _xIsSelect ) ret
27490 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
274a0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
274b0 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
274c0 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20  >pLeft, iTab) ) 
274d0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
274e0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
274f0 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
27500 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pB->pRight, iTa
27510 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
27520 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
27530 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41  prListCompare(pA
27540 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78  ->x.pList, pB->x
27550 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20  .pList, iTab) ) 
27560 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
27570 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e  ( ALWAYS((combin
27580 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64  edFlags & EP_Red
27590 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70 41 2d  uced)==0) && pA-
275a0 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op!=TK_STRING )
275b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  {.      if( pA->
275c0 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
275d0 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
275e0 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
275f0 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
27600 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 41  e .       && (pA
27610 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
27620 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62  | NEVER(pB->iTab
27630 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e  le>=0)) ) return
27640 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
27650 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
27660 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45  ** Compare two E
27670 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e  xprList objects.
27680 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
27690 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
276a0 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72   and .** non-zer
276b0 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  o if they differ
276c0 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
276d0 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
276e0 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
276f0 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
27700 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
27710 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
27720 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
27730 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
27740 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
27750 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
27760 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
27770 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e  e might return n
27780 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69  on-zero for equi
27790 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73  valent ExprLists
277a0 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63  .  The.** only c
277b0 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  onsequence will 
277c0 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69  be disabled opti
277d0 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20  mizations.  But 
277e0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
277f0 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72  must never retur
27800 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45  n 0 if the two E
27810 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20  xprList objects 
27820 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f  are different, o
27830 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69  r.** a malfuncti
27840 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a  on will result..
27850 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70  **.** Two NULL p
27860 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73  ointers are cons
27870 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65  idered to be the
27880 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55   same.  But a NU
27890 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c  LL pointer.** al
278a0 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f  ways differs fro
278b0 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69  m a non-NULL poi
278c0 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
278d0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
278e0 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41  are(ExprList *pA
278f0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20  , ExprList *pB, 
27900 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74  int iTab){.  int
27910 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
27920 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  && pB==0 ) retur
27930 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  n 0;.  if( pA==0
27940 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75   || pB==0 ) retu
27950 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 1;.  if( pA->
27960 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72  nExpr!=pB->nExpr
27970 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
27980 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45  or(i=0; i<pA->nE
27990 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
279a0 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41  xpr *pExprA = pA
279b0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
279c0 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d    Expr *pExprB =
279d0 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pB->a[i].pExpr;
279e0 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69  .    if( pA->a[i
279f0 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d  ].sortOrder!=pB-
27a00 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
27a10 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
27a20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
27a30 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70  ompare(pExprA, p
27a40 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72  ExprB, iTab) ) r
27a50 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
27a60 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
27a70 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
27a80 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68   we can prove th
27a90 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79  e pE2 will alway
27aa0 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31  s be true if pE1
27ab0 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65   is.** true.  Re
27ac0 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65  turn false if we
27ad0 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   cannot complete
27ae0 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66   the proof or if
27af0 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65   pE2 might.** be
27b00 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65   false.  Example
27b10 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31  s:.**.**     pE1
27b20 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32  : x==5       pE2
27b30 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
27b40 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
27b50 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20  **     pE1: x>0 
27b60 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35         pE2: x==5
27b70 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
27b80 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
27b90 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20    pE1: x=21     
27ba0 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79    pE2: x=21 OR y
27bb0 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20  =43     Result: 
27bc0 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
27bd0 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a   x!=123     pE2:
27be0 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
27bf0 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
27c00 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31  *     pE1: x!=?1
27c10 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20        pE2: x IS 
27c20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
27c30 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
27c40 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20  pE1: x IS NULL  
27c50 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
27c60 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61  LL    Result: fa
27c70 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
27c80 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20  x IS ?2    pE2: 
27c90 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
27ca0 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a   Reuslt: false.*
27cb0 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72  *.** When compar
27cc0 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ing TK_COLUMN no
27cd0 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20  des between pE1 
27ce0 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20  and pE2, if pE2 
27cf0 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62  has.** Expr.iTab
27d00 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65  le<0 then assume
27d10 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20   a table number 
27d20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a  given by iTab..*
27d30 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75  *.** When in dou
27d40 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  bt, return false
27d50 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75  .  Returning tru
27d60 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  e might give a p
27d70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d  erformance.** im
27d80 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75  provement.  Retu
27d90 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68  rning false migh
27da0 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72  t cause a perfor
27db0 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c  mance reduction,
27dc0 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20   but.** it will 
27dd0 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20  always give the 
27de0 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61  correct answer a
27df0 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61  nd is hence alwa
27e00 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20  ys safe..*/.int 
27e10 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
27e20 65 73 45 78 70 72 28 45 78 70 72 20 2a 70 45 31  esExpr(Expr *pE1
27e30 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74  , Expr *pE2, int
27e40 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71   iTab){.  if( sq
27e50 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
27e60 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29  (pE1, pE2, iTab)
27e70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
27e80 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
27e90 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20  E2->op==TK_OR.  
27ea0 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72   && (sqlite3Expr
27eb0 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c  ImpliesExpr(pE1,
27ec0 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
27ed0 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b).             
27ee0 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  || sqlite3ExprIm
27ef0 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70  pliesExpr(pE1, p
27f00 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  E2->pRight, iTab
27f10 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ) ).  ){.    ret
27f20 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
27f30 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54   pE2->op==TK_NOT
27f40 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c 69 74  NULL.   && sqlit
27f50 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
27f60 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d 3e 70  1->pLeft, pE2->p
27f70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 0a 20  Left, iTab)==0. 
27f80 20 20 26 26 20 28 70 45 31 2d 3e 6f 70 21 3d 54    && (pE1->op!=T
27f90 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d  K_ISNULL && pE1-
27fa0 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20 29 7b  >op!=TK_IS).  ){
27fb0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
27fc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
27fd0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
27fe0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
27ff0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
28000 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
28010 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
28020 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  determine if an 
28030 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
28040 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72  e evaluated by r
28050 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
28060 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77  ** index only, w
28070 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
28080 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
28090 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
280a0 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72  ng.** table entr
280b0 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72  y.  The IdxCover
280c0 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74  .pIdx field is t
280d0 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f  he index.  IdxCo
280e0 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74  ver.iCur.** is t
280f0 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  he cursor for th
28100 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  e table..*/.stru
28110 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20  ct IdxCover {.  
28120 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
28130 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
28140 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63   be tested for c
28150 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74  overage */.  int
28160 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a   iCur;        /*
28170 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
28180 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72  or the table cor
28190 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
281a0 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f  e index */.};../
281b0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
281c0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72  e if there are r
281d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
281e0 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a  umns in table .*
281f0 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
28200 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e  xCover->iCur can
28210 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73   be satisfied us
28220 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ing the index.**
28230 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
28240 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a  Cover->pIdx..*/.
28250 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
28260 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a  dxCover(Walker *
28270 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
28280 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
28290 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
282a0 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  N.   && pExpr->i
282b0 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
282c0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
282d0 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43  r.   && sqlite3C
282e0 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61  olumnOfIndex(pWa
282f0 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
28300 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e  r->pIdx, pExpr->
28310 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a  iColumn)<0.  ){.
28320 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
28330 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  de = 1;.    retu
28340 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
28350 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
28360 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
28370 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
28380 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20  n index pIdx on 
28390 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
283a0 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  r iCur contains 
283b0 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72  will.** the expr
283c0 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
283d0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
283e0 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76  e index does cov
283f0 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  er the.** expres
28400 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69  sion and false i
28410 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  f the pExpr expr
28420 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  ession reference
28430 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a  s table columns.
28440 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
28450 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64  found in the ind
28460 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41  ex pIdx..**.** A
28470 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67  n index covering
28480 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
28490 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78  eans that the ex
284a0 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a  pression can be.
284b0 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69  ** evaluated usi
284c0 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65  ng only the inde
284d0 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61  x and without ha
284e0 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74  ving to lookup t
284f0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
28500 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  ing table entry.
28510 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
28520 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65  xprCoveredByInde
28530 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  x(.  Expr *pExpr
28540 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
28550 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
28560 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
28570 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
28580 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
28590 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
285a0 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  onding table */.
285b0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
285c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
285d0 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ex that might be
285e0 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61   used for covera
285f0 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65  ge */.){.  Walke
28600 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64  r w;.  struct Id
28610 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d  xCover xcov;.  m
28620 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
28630 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e  eof(w));.  xcov.
28640 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78  iCur = iCur;.  x
28650 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  cov.pIdx = pIdx;
28660 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
28670 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65  ck = exprIdxCove
28680 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76  r;.  w.u.pIdxCov
28690 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71  er = &xcov;.  sq
286a0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
286b0 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75  , pExpr);.  retu
286c0 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  rn !w.eCode;.}..
286d0 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
286e0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
286f0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
28700 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
28710 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63  e walker.** to c
28720 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  ount references 
28730 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  to table columns
28740 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
28750 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72  s of an .** aggr
28760 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  egate function, 
28770 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
28780 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c  ement the.** sql
28790 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73  ite3FunctionThis
287a0 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  Src() routine..*
287b0 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e  /.struct SrcCoun
287c0 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  t {.  SrcList *p
287d0 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61  Src;   /* One pa
287e0 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c  rticular FROM cl
287f0 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64  ause in a nested
28800 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
28810 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20  nThis;       /* 
28820 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
28830 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
28840 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  in pSrcList */. 
28850 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20   int nOther;    
28860 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
28870 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
28880 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52  umns in other FR
28890 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b  OM clauses */.};
288a0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
288b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
288c0 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
288d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
288e0 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61   exprSrcCount(Wa
288f0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
28900 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f  xpr *pExpr){.  /
28910 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e  * The NEVER() on
28920 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d   the second term
28930 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69   is because sqli
28940 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
28950 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73  hisSrc().  ** is
28960 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62   always called b
28970 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70  efore sqlite3Exp
28980 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
28990 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a  es() and so the.
289a0 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20    ** TK_COLUMNs 
289b0 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
289c0 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  n converted into
289d0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
289e0 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   If.  ** sqlite3
289f0 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
28a00 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69  Src() is used di
28a10 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  fferently in the
28a20 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a   future, the.  *
28a30 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e  * NEVER() will n
28a40 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eed to be remove
28a50 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  d. */.  if( pExp
28a60 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
28a70 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d   || NEVER(pExpr-
28a80 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
28a90 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  MN) ){.    int i
28aa0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
28ab0 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b  Count *p = pWalk
28ac0 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b  er->u.pSrcCount;
28ad0 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
28ae0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
28af0 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72    int nSrc = pSr
28b00 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a  c ? pSrc->nSrc :
28b10 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
28b20 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20   i<nSrc; i++){. 
28b30 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
28b40 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
28b50 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65  i].iCursor ) bre
28b60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
28b70 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20  ( i<nSrc ){.    
28b80 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20    p->nThis++;.  
28b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
28ba0 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20  ->nOther++;.    
28bb0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
28bc0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
28bd0 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
28be0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
28bf0 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
28c00 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
28c10 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c  ference.** pSrcL
28c20 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ist.  Return tru
28c30 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41  e if they do.  A
28c40 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20  lso return true 
28c50 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  if the function.
28c60 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65  ** has no argume
28c70 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20  nts or has only 
28c80 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
28c90 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ts.  Return fals
28ca0 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65  e if pExpr.** re
28cb0 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73  ferences columns
28cc0 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   but not columns
28cd0 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64   of tables found
28ce0 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f   in pSrcList..*/
28cf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63  .int sqlite3Func
28d00 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
28d10 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63  Expr *pExpr, Src
28d20 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b  List *pSrcList){
28d30 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
28d40 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63  truct SrcCount c
28d50 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  nt;.  assert( pE
28d60 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
28d70 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65  FUNCTION );.  me
28d80 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
28d90 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
28da0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
28db0 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e  SrcCount;.  w.u.
28dc0 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74  pSrcCount = &cnt
28dd0 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70  ;.  cnt.pSrc = p
28de0 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e  SrcList;.  cnt.n
28df0 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e  This = 0;.  cnt.
28e00 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71  nOther = 0;.  sq
28e10 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
28e20 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(&w, pExpr->x.p
28e30 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
28e40 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63  cnt.nThis>0 || c
28e50 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a  nt.nOther==0;.}.
28e60 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
28e70 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
28e80 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
28e90 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
28ea0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
28eb0 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
28ec0 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
28ed0 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
28ee0 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
28ef0 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
28f00 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
28f10 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
28f20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
28f30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
28f40 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
28f50 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
28f60 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
28f70 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
28f80 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
28f90 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
28fa0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20  nfo->nColumn,.  
28fb0 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
28fc0 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
28fd0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
28fe0 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
28ff0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
29000 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
29010 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
29020 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
29030 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
29040 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
29050 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
29060 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
29070 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33  InfoFunc(sqlite3
29080 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
29090 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
290a0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
290b0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
290c0 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
290d0 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  , .       pInfo-
290e0 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73  >aFunc,.       s
290f0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
29100 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  nc[0]),.       &
29110 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
29120 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
29130 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
29140 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
29150 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  e xExprCallback 
29160 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65  for a tree walke
29170 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74  r.  It is used t
29180 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73  o.** implement s
29190 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
291a0 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
291b0 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
291c0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
291d0 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
291e0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
291f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
29200 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57  alyzeAggregate(W
29210 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
29220 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
29230 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
29240 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
29250 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61  ker->u.pNC;.  Pa
29260 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
29270 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
29280 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
29290 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
292a0 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
292b0 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49  nfo = pNC->pAggI
292c0 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  nfo;..  switch( 
292d0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
292e0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
292f0 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
29300 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
29310 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
29320 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
29330 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
29340 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
29350 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
29360 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
29370 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
29380 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
29390 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
293a0 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
293b0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
293c0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
293d0 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
293e0 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29  S(pSrcList!=0) )
293f0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
29400 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
29410 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
29420 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
29430 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
29440 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
29450 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
29460 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
29470 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
29480 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
29490 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
294a0 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
294b0 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
294c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
294d0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
294e0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
294f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
29500 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
29510 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
29520 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
29530 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
29540 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
29550 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
29560 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
29570 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
29580 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
29590 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
295a0 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
295b0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
295c0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
295d0 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
295e0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
295f0 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
29600 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
29610 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
29620 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
29630 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
29640 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
29650 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
29660 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
29670 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
29680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29690 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
296a0 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
296b0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
296c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
296d0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
296e0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
296f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
29700 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29710 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29720 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
29730 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
29740 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
29750 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
29760 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
29770 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
29780 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
29790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
297a0 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
297b0 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
297c0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
297d0 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
297e0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
297f0 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
29800 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
29810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
29820 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
29830 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
29840 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
29850 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
29860 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
29870 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
29880 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
29890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
298a0 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
298b0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
298c0 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
298d0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
298e0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
298f0 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
29900 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
29910 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
29920 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
29930 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
29940 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
29950 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29970 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29990 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
299a0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
299b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
299c0 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
299d0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
299e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
299f0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
29a00 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
29a10 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a30 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
29a40 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
29a50 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
29a60 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
29a70 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
29a80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29a90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
29ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29ac0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
29ad0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
29ae0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
29af0 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
29b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
29b10 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
29b20 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
29b30 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
29b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
29b50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29b70 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
29b80 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
29b90 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
29ba0 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
29bb0 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
29bc0 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
29bd0 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
29be0 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
29bf0 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
29c00 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
29c10 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
29c20 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
29c30 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
29c40 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
29c50 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
29c60 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
29c70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
29c80 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
29c90 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
29ca0 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  duce);.         
29cb0 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
29cc0 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
29cd0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
29ce0 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
29cf0 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
29d00 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
29d10 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20  (i16)k;.        
29d20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29d30 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
29d40 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
29d50 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
29d60 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
29d70 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
29d80 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
29d90 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
29da0 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
29db0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
29dc0 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
29dd0 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67  if( (pNC->ncFlag
29de0 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63  s & NC_InAggFunc
29df0 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )==0.       && p
29e00 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
29e10 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a  pth==pExpr->op2.
29e20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
29e30 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
29e40 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
29e50 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
29e60 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
29e70 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
29e80 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
29e90 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
29ea0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
29eb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29ec0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
29ed0 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
29ee0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
29ef0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
29f00 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
29f10 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
29f20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
29f30 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
29f40 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
29f50 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b  pExpr, -1)==0 ){
29f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
29f70 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
29f80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29f90 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
29fa0 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
29fb0 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
29fc0 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
29fd0 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
29fe0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
29ff0 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
2a000 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
2a010 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
2a020 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
2a030 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
2a040 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
2a050 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
2a060 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20    if( i>=0 ){.  
2a070 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2a080 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2a090 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
2a0a0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
2a0b0 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26         pItem = &
2a0c0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2a0d0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
2a0e0 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
2a0f0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2a100 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20    pItem->iMem = 
2a110 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2a120 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2a130 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2a140 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
2a150 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
2a160 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
2a170 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
2a180 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
2a190 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
2a1a0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2a1b0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20  >u.zToken, .    
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2a1d0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20  Expr->x.pList ? 
2a1e0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
2a1f0 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
2a200 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2a210 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
2a220 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29   & EP_Distinct )
2a230 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a240 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
2a250 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2a260 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
2a270 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2a280 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
2a290 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
2a2a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a2b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2a2c0 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70         /* Make p
2a2d0 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68  Expr point to th
2a2e0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41  e appropriate pA
2a2f0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
2a300 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f  entry.        */
2a310 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a320 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2a330 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
2a340 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
2a350 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ) );.        Exp
2a360 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2a370 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
2a380 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  ce);.        pEx
2a390 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
2a3a0 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
2a3b0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
2a3c0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72  gInfo;.        r
2a3d0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2a3e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a3f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2a400 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
2a410 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
2a420 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2a430 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  ue;.}.static int
2a440 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2a450 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65  esInSelect(Walke
2a460 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
2a470 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
2a480 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a490 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55  (pWalker);.  UNU
2a4a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53  SED_PARAMETER(pS
2a4b0 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  elect);.  return
2a4c0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2a4d0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
2a4e0 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
2a4f0 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
2a500 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2a510 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
2a520 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
2a530 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
2a540 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  to AggInfo objec
2a550 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67  t that pNC->pAgg
2a560 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  Info.** points t
2a570 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  o.  Additional e
2a580 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20  ntries are made 
2a590 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f  on the AggInfo o
2a5a0 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65  bject as.** nece
2a5b0 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
2a5c0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
2a5d0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
2a5e0 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
2a5f0 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
2a600 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
2a610 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
2a620 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
2a630 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2a640 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
2a650 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
2a660 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
2a670 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
2a680 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
2a690 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
2a6a0 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2a6b0 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
2a6c0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2a6d0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2a6e0 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
2a6f0 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61  u.pNC = pNC;.  a
2a700 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
2a710 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c  List!=0 );.  sql
2a720 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
2a730 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
2a740 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  * Call sqlite3Ex
2a750 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2a760 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20  tes() for every 
2a770 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e  expression in an
2a780 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
2a790 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ist.  Return the
2a7a0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
2a7b0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
2a7c0 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  rror is found, t
2a7d0 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63  he analysis is c
2a7e0 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69  ut short..*/.voi
2a7f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
2a800 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
2a810 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
2a820 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
2a830 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2a840 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2a850 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
2a860 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
2a870 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
2a880 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
2a890 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
2a8a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a8b0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2a8c0 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
2a8d0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
2a8e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
2a8f0 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e  ocate a single n
2a900 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ew register for 
2a910 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65  use to hold some
2a920 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
2a930 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sult..*/.int sql
2a940 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50  ite3GetTempReg(P
2a950 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
2a960 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
2a970 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  mpReg==0 ){.    
2a980 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d  return ++pParse-
2a990 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74  >nMem;.  }.  ret
2a9a0 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  urn pParse->aTem
2a9b0 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e  pReg[--pParse->n
2a9c0 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a  TempReg];.}../*.
2a9d0 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
2a9e0 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67  register, making
2a9f0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72   available for r
2aa00 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  euse for some ot
2aa10 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a  her.** purpose..
2aa20 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
2aa30 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
2aa40 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74   being used by t
2aa50 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c  he column cache,
2aa60 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61   then.** the dea
2aa70 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66  llocation is def
2aa80 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
2aa90 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e  column cache lin
2aaa0 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74  e that uses.** t
2aab0 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f  he register beco
2aac0 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f  mes stale..*/.vo
2aad0 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
2aae0 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
2aaf0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
2ab00 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
2ab10 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2ab20 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
2ab30 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
2ab40 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2ab50 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
2ab60 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
2ab70 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
2ab80 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
2ab90 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
2aba0 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
2abb0 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
2abc0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d  {.        p->tem
2abd0 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  pReg = 1;.      
2abe0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
2abf0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
2ac00 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
2ac10 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
2ac20 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
2ac30 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
2ac40 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
2ac50 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
2ac60 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
2ac70 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2ac80 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50  e3GetTempRange(P
2ac90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2aca0 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
2acb0 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  , n;.  if( nReg=
2acc0 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69  =1 ) return sqli
2acd0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2ace0 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50 61  arse);.  i = pPa
2acf0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a  rse->iRangeReg;.
2ad00 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52    n = pParse->nR
2ad10 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e  angeReg;.  if( n
2ad20 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73  Reg<=n ){.    as
2ad30 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c  sert( !usedAsCol
2ad40 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
2ad50 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20   i, i+n-1) );.  
2ad60 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
2ad70 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
2ad80 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2ad90 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
2ada0 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
2adb0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
2adc0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2add0 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
2ade0 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
2adf0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2ae00 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
2ae10 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
2ae20 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20  nt nReg){.  if( 
2ae30 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73  nReg==1 ){.    s
2ae40 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2ae50 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65  pReg(pParse, iRe
2ae60 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  g);.    return;.
2ae70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
2ae80 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
2ae90 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29  rse, iReg, nReg)
2aea0 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61  ;.  if( nReg>pPa
2aeb0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29  rse->nRangeReg )
2aec0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  {.    pParse->nR
2aed0 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a  angeReg = nReg;.
2aee0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
2aef0 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  geReg = iReg;.  
2af00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  }.}../*.** Mark 
2af10 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65  all temporary re
2af20 67 69 73 74 65 72 73 20 61 73 20 62 65 69 6e 67  gisters as being
2af30 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72   unavailable for
2af40 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20   reuse..*/.void 
2af50 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
2af60 52 65 67 43 61 63 68 65 28 50 61 72 73 65 20 2a  RegCache(Parse *
2af70 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73  pParse){.  pPars
2af80 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b  e->nTempReg = 0;
2af90 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  .  pParse->nRang
2afa0 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  eReg = 0;.}../*.
2afb0 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68 61 74  ** Validate that
2afc0 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65   no temporary re
2afd0 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74  gister falls wit
2afe0 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66  hin the range of
2aff0 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73  .** iFirst..iLas
2b000 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54  t, inclusive.  T
2b010 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
2b020 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69  nly call from wi
2b030 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a  thin assert().**
2b040 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
2b050 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2b060 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e  BUG.int sqlite3N
2b070 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61  oTempsInRange(Pa
2b080 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2b090 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61   iFirst, int iLa
2b0a0 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
2b0b0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  if( pParse->nRan
2b0c0 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50  geReg>0.   && pP
2b0d0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b  arse->iRangeReg+
2b0e0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2b0f0 67 3c 69 4c 61 73 74 0a 20 20 20 26 26 20 70 50  g<iLast.   && pP
2b100 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3e  arse->iRangeReg>
2b110 3d 69 46 69 72 73 74 0a 20 20 29 7b 0a 20 20 20  =iFirst.  ){.   
2b120 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2b130 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
2b140 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69  rse->nTempReg; i
2b150 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
2b160 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d  rse->aTempReg[i]
2b170 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50 61 72  >=iFirst && pPar
2b180 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c  se->aTempReg[i]<
2b190 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  =iLast ){.      
2b1a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
2b1b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
2b1c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2b1d0 54 45 5f 44 45 42 55 47 20 2a 2f 0a              TE_DEBUG */.